的第一件事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