Уведомления

Группа в Telegram: @pythonsu

#1 Июль 31, 2011 15:17:47

Yuego
От:
Зарегистрирован: 2011-07-26
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Много лишних запросов в БД

Есть вот такие модели:

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 делает лишнюю работу?
Быть может, я как-то неправильно использовал какие-то классы? Тогда поправьте меня. Или подскажите, как избавиться от этой кучи лишней работы.



Офлайн

#2 Авг. 1, 2011 09:34:03

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Много лишних запросов в БД

Вот он виновник:

    def __unicode__(self):
return u'%s.%s %s' % (self.group.number, self.number, self.title)
В виджете ModelMultipleChoiceField для генерации списка используеться model.__unicode__ который каждый раз дергает БД дабы получить self.group.number.
QuerySet.select_related должен помочь.



Отредактировано (Авг. 1, 2011 09:34:46)

Офлайн

#3 Авг. 1, 2011 13:23:28

Yuego
От:
Зарегистрирован: 2011-07-26
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Много лишних запросов в БД

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 должен помочь.
Спасибо! То, что нужно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version