Django formsets只是將表單創建的所有細節委託給表單對象本身,並且各個表單實例並不知道其他表單對象,因此每個用戶都必須查詢自己的選擇並不意外。
緩存也可能會導致意外的副作用 - 例如,窗體的__init__
功能可能是依賴於它接收到的initial
數據,使緩存form
對象不正確。
減少查詢次數的最佳方法是檢索選擇查詢集一次,然後將它們傳遞給您的構造函數中的表單類。這將需要定義一個自定義ModelForm
和一個自定義ModelFormSet
。
你的形式將需要直接接受的選擇一個構造函數:
from django.forms.models import ModelForm
class MyForm(ModelForm):
def __init__(self, my_field_choices=None, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_field'].choices = my_field_choices
而且你的表單集將需要重寫運行的查詢集,並將它們傳遞到形式的方法,因爲他們正在構建:
from django.forms.models import BaseModelFormSet
class MyFormSet(BaseModelFormSet):
def _construct_forms(self):
# instantiate all the forms and put them in self.forms
self.forms = []
# Define each of your choices querysets
my_field_choices = Model.object.filter(...)
#Add your querysets to a dict to pass to the form
form_defaults = {'my_field_choices': my_field_choices, }
for i in xrange(min(self.total_form_count(), self.absolute_max)):
self.forms.append(self._construct_form(i, **form_defaults))
(見the Django source尋找到如何做到這一點的工作)
django1.5有模型內存緩存。 – danihp 2013-03-04 14:27:33
你說得對(https://docs.djangoproject.com/en/1.5/releases/1.5/#caching-of-related-model-instances),但不幸的是它不會影響這個問題。 – jnns 2013-03-04 23:22:49
我已經做了一些小技巧來解決這個問題:http://stackoverflow.com/a/43105646/8450 – 2017-03-29 23:07:15