Django form kümeleri, form oluşturma işleminin tüm ayrıntılarını yalnızca form nesnelerine aktarır ve tek tek form örnekleri diğerlerinin farkında değildir, dolayısıyla her birinin kendi seçimleri için sorgulaması beklenmedik bir durum değildir.
önbelleğe alma aynı zamanda yan etkileri üzerindeki istenmeyen - örneğin, formun __init__
fonksiyonu önbelleğe form
amacı hatalı hale aldığı initial
verilerine bağlı olabilir.
Sorgu sayısını azaltmanın en iyi yolu, seçim sorgularını bir kez almak ve bunları oluşturucudaki form sınıflarınıza iletmektir. Bu, özel bir ModelForm
ve özel bir ModelFormSet
tanımlanmasını gerektirecektir.
doğrudan seçimler kabul eden bir kurucu gerekir şekliniz:
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
Ve onlar inşa ediyoruz gibi Formset Sorgu kümelerini çalıştırmak ve formlar içine geçmesi için bir yöntem geçersiz kılmak gerekir:
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))
(bu nasıl olacağı içine bakmak the Django source bakınız)
django1.5 modeli bellek önbelleği bulunur. – danihp
Haklısınız (https://docs.djangoproject.com/en/1.5/releases/1.5/#caching-of-related-model-instances), ancak maalesef bu sorunu etkilemez. – jnns
Bu sorunu çözmek için küçük bir hack yaptım: http://stackoverflow.com/a/43105646/8450 –