12

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

4

3 回答 3

25

怎么样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')
于 2012-07-17T12:49:25.117 回答
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
于 2012-03-22T17:38:53.923 回答
1

ModelChoiceFields 旨在用于在现有模型实例的选择之间进行选择。这几乎总是最好用某种形式的 Select 字段来表示。

就是说,正如您所暗示的那样,您是否真的有从地址到邮政编码的 FK。你在 PostalCode 表上存储了什么来证明每个地址相关查询都需要加入额外的表?

在大多数情况下,postal_code 应该只是一个 CharField,在这种情况下,如果您想验证该值是否有效,您可以使用choices带有有效邮政编码列表的属性。请记住,手动维护有效邮政编码列表非常麻烦。

如果您确实有一个 PostalCode 表并认为这是一个好主意(在某些情况下可能是这样),您可能需要考虑实际使用 postal_code 作为主键而不是默认的自动增量,因为它必须是唯一的,从而使您的数据更易于导出,并通过验证解决您的问题。

于 2012-03-22T17:34:08.613 回答