假设我有一个address
表并且它有一个postal_code
字段 - ModelChoiceField不允许我使用PK之外的其他东西来验证存在是否正确?怎么走?正常输入并使用clean_*()
?
答案 0 :(得分:23)
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')
答案 1 :(得分:1)
如果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
答案 2 :(得分:0)
ModelChoiceFields用于在现有模型实例的选择之间进行选择。这几乎总是最好用某种形式的选择字段来表示。
那说你真的有从地址到postal_code的FK,就像你暗示的那样。你在PostalCode表上存储什么来证明每个地址相关查询需要加入的额外表格?
对于大多数情况,postal_code应该只是一个CharField,在这种情况下,如果要验证该值是否有效,可以使用choices
属性和有效邮政编码列表。请记住,手工维护一份有效的邮政编码是一件非常麻烦的事。
如果你真的有一个PostalCode表并且认为它是一个好主意(在某些情况下它可能是)你可能想要考虑实际使用postal_code作为主键而不是默认的自动增量,因为它必然是唯一的,使你的数据更易于导出,并通过验证解决您的问题。