Django ModelChoiceField - 使用除id以外的东西?

时间:2012-03-22 17:06:20

标签: python django validation django-forms django-validation

假设我有一个address表并且它有一个postal_code字段 - ModelChoiceField不允许我使用PK之外的其他东西来验证存在是否正确?怎么走?正常输入并使用clean_*()

3 个答案:

答案 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作为主键而不是默认的自动增量,因为它必然是唯一的,使你的数据更易于导出,并通过验证解决您的问题。