如何阻止Django ModelForm创建外键选择

时间:2014-07-25 22:18:04

标签: django django-forms

我有一个带有外键的Django模型,该表包含大约50,000条记录。我正在使用Django forms.ModelForm来创建表单。问题是我只需要外键指向的表中的一小部分记录。

我可以在 init 方法中创建该选项子集。如何防止ModelForm创建初始选择集?

我尝试在Meta方法中使用widgets参数。但是Django调试工具栏表明数据库仍在被击中。

由于

1 个答案:

答案 0 :(得分:2)

自动生成的ModelChoiceField会将其queryset初始化为默认值。小部件不是您应该自定义queryset属性的位置。

手动定义ModelChoiceField,将其queryset初始化为空。请记住将ModelChoiceField命名为与自动生成的{1}}相同,并记住在fields元组中提及该字段。现在,您可以从构造函数中设置queryset,并避免数据库被命中两次。

如果你很幸运(你可能会,但请测试),queryset在施工期间尚未进行评估,在这种情况下,不需要手动定义ModelChoiceField

class YourModelForm(ModelForm):
    your_fk_field_name = forms.ModelChoiceField(queryset=YourModel.objects.none())

    class Meta:
        model = YourModel
        fields = ('your_fk_field_name', .......)

    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['your_fk_field_name'].queryset = ....