Найти - Пользователи
Полная версия: Много лишних запросов в БД
Начало » Django » Много лишних запросов в БД
1
Yuego
Есть вот такие модели:

class DocumentGroup(models.Model):  
title = models.CharField(u'Название группы', max_length=255)
number = models.CharField(u'Номер группы', max_length=3)

def __unicode__(self):
return u'%s %s' % (self.number, self.title)

class Document(models.Model):
group = models.ForeignKey(DocumentGroup)
number = models.CharField(u'Номер документа в группе', max_length=3)
title = models.CharField(u'Название документа', max_length=255)

def __unicode__(self):
return u'%s.%s %s' % (self.group.number, self.number, self.title)
И вот такая форма:

class DocumentForm(forms.Form):

id = forms.IntegerField(widget=forms.HiddenInput, required=False)
documents = forms.ModelMultipleChoiceField(queryset = Document.objects.none(), widget=CheckboxSelectMultipleGroups,
required=False, label=u'Документы')
services = forms.ModelMultipleChoiceField(queryset = Service.objects.all(), widget=forms.MultipleHiddenInput)
categories = forms.ModelMultipleChoiceField(queryset = Category.objects.all(), widget=forms.MultipleHiddenInput)

def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=forms.util.ErrorList, label_suffix=':',
empty_permitted=False):

super(DocumentForm, self).__init__(data, files, auto_id, prefix,
initial, error_class, label_suffix,
empty_permitted)

services = None
if data:
services = data.getlist('services')
if initial:
services = initial['services']
if services:
self.fields[u'documents'].queryset = Document.objects.filter(service__in=services).distinct()
Не обращайте внимания на поля, для которых я не показал модели - они сейчас не имеют значения.

Так вот. При отображении этой формы идет, как и положено, запрос в БД, соответствующий
Document.objects.filter(service__in=services).distinct()
.
А затем еще по одному запросу к таблице DocumentGroup на каждую отобранную запись. В первом запросе все необходимые данные уже отобраны. Зачем Django делает лишнюю работу?
Быть может, я как-то неправильно использовал какие-то классы? Тогда поправьте меня. Или подскажите, как избавиться от этой кучи лишней работы.
pill
Вот он виновник:
    def __unicode__(self):
return u'%s.%s %s' % (self.group.number, self.number, self.title)
В виджете ModelMultipleChoiceField для генерации списка используеться model.__unicode__ который каждый раз дергает БД дабы получить self.group.number.
QuerySet.select_related должен помочь.
Yuego
pill
Вот он виновник:
    def __unicode__(self):
return u'%s.%s %s' % (self.group.number, self.number, self.title)
В виджете ModelMultipleChoiceField для генерации списка используеться model.__unicode__ который каждый раз дергает БД дабы получить self.group.number.
QuerySet.select_related должен помочь.
Спасибо! То, что нужно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB