假设我有一个address
表并且它有一个postal_code
字段——ModelChoiceField 不允许我使用 PK 以外的东西来验证存在是否正确?要走的路是什么?正常输入和使用clean_*()
?
3 回答
怎么样to_field_name
?我不确定它是否记录在任何地方,但您可以在ModelChoiceField
构造函数参数之间轻松找到它:https ://github.com/django/django/blob/master/django/forms/models.py 。它用于过滤字段查询集。
例如:
articles = ModelChoiceField(queryset=Articles.objects.all(),
to_field_name='slug')
如果postal_code
是包含有效邮政编码的 PostalCode 模型的外键,我只会使用 CharField ,然后按照您的建议进行清理。我的干净方法如下所示:
def clean_postal_code(self):
try:
code = PostalCode.objects.get(code_field=self.data['postal_code'])
except:
raise forms.ValidationError("Please enter a valid postal code")
return code
ModelChoiceFields 旨在用于在现有模型实例的选择之间进行选择。这几乎总是最好用某种形式的 Select 字段来表示。
就是说,正如您所暗示的那样,您是否真的有从地址到邮政编码的 FK。你在 PostalCode 表上存储了什么来证明每个地址相关查询都需要加入额外的表?
在大多数情况下,postal_code 应该只是一个 CharField,在这种情况下,如果您想验证该值是否有效,您可以使用choices
带有有效邮政编码列表的属性。请记住,手动维护有效邮政编码列表非常麻烦。
如果您确实有一个 PostalCode 表并认为这是一个好主意(在某些情况下可能是这样),您可能需要考虑实际使用 postal_code 作为主键而不是默认的自动增量,因为它必须是唯一的,从而使您的数据更易于导出,并通过验证解决您的问题。