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