我有一个带有外键的Django模型,该表包含大约50,000条记录。我正在使用Django forms.ModelForm来创建表单。问题是我只需要外键指向的表中的一小部分记录。
我可以在 init 方法中创建该选项子集。如何防止ModelForm创建初始选择集?
我尝试在Meta方法中使用widgets参数。但是Django调试工具栏表明数据库仍在被击中。
由于
答案 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 = ....