我有一个带有一些模型(多个)选择字段的表单,这些字段有很多选项,我想根据前端的用户响应减少可用选项,然后通过AJAX填充选择选项。 / p>
我对Django在这种情况下查询数据库的时间有点困惑,以及用AJAX数据填充的Django ModelChoice字段的最佳实践。
最初,我一直在做这样的事情:
contact = forms.ModelChoiceField(queryset=aRelatedModel.objects.all())
或受限制的查询集:
contact = forms.ModelChoiceField(queryset=aRelatedModel.objects.filter(somefield = someValue))
所以,我的问题是,什么时候查询数据库的ModelChoice选项?
混淆源于我所做的另一种形式,我有一个ModelChoiceField,能够动态添加新选项。在这种情况下,除非我在保存新选项后实例化ModelChoiceField ,否则我会收到错误。这让我觉得在表单实例化时查询数据库。但是,考虑到Django查询集的惰性,看起来直到你遍历所述列表(即打印表单选项时)才查询数据库也是有意义的。
那么,在这种情况下有没有办法避免可能不必要的数据库查询?使用AJAX数据填充的ModelChoiceFields的最佳实践是什么?
我见过提及:
contact = forms.ModelChoiceField(queryset=aRelatedModel.objects.none())
...但从未明确解释为何使用此原因。
修改
在这种情况下,我有一个带
的表格field = forms.ModelChoiceField(queryset = relatedModel.objects.all())
随后在视图中,我天真地做了:
myForm = modelForm(request.POST)
。如果我在首先保存动态添加的字段之前实例化表单,则会产生错误。添加字段后,然后调用modelForm(request.POST)我不再有"无效的选择"错误 - 可能是因为动态添加的字段现在包含在modelForm查询集中。