的第一件事Django的内联表单集并在您提交的数据是它的每一个循环的形式触发验证:为formset Django中的ModelChoiceField优化验证?
for i in range(0, self.total_form_count()):
form = self.forms[i]
self._errors.append(form.errors)
在图片中,其中该formset是行对个人形式,验证工作表行由行。如果表单中有ModelChoiceField
,则将在ModelChoiceField
的查询集中查找每行中选定的值,从而每行至少再添加一个数据库命中。
key = self.to_field_name or 'pk'
value = self.queryset.get(**{key: value})
现在,如果所有这些查询集都是相同的(如我的),这似乎是一种浪费。查询集不会逐行更改,有什么方法可以缓存它吗?
更一般地说,在列中进行验证会更有效率,例如,首先收集窗体类的字段,并对每个字段(列)的所有表单(行)进行循环?
但是,然后你失去了所有的模型的好处,就像开箱即用的验证,保存等... –
保存做得不错,也验证 - 除非你的选择产生错误,但你也可以在这里使用'ModelChoiceField' ,它应该可以正常工作。对选择使用'ModelChoiceField'将会阻止执行查询集,字段将使用预先填充的选项。 – GwynBleidD