Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2013 12:40:39

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Оптимизация ORM, вьюхи и шаблоны.

Привет.
У меня вопрос по поводу оптимизации, ORM и шаблонов Django.
К примеру есть модель:

class MyModel(models.Model):
    name = models.CharField()
    to_model1 = models.ForeignKey(Model1)
    to_model2 = models.ManyToManyField(Model2)

Делаю запрос во вьюхе.
def myview(request):
    q = MyModel.objects.filter(to_model1__name='blahblah')
    render(request, 'blahblah.html', {'q': q})      

В шаблоне:
{% for result in q %}
    {{ result.to_model1 }}
{% endfor %}

Вопросы следующие:
1.
Насколько я понимаю, что если я изменю запрос во вьюхе на:
q = MyModel.objects.prefetch_related().filter(to_model1__name='blahblah')
то никакой выгоды в количестве запросов к базе я не получу?
Ведь данные из связанной таблицы (вариант выше) уже попадают в результат выборки благодаря - “to_model1__name”.
Или запрос к базе происходит когда я в шаблоне вызываю:
{{ result.to_model1 }}
Тогда есть смысл использовать prefetch_related().
2. Не могу понять в чём разница:
q = MyModel.objects.prefetch_related().filter(to_model1__name='blahblah')
и
q = MyModel.objects.filter(to_model1__name='blahblah').prefetch_related()
3.
Данные
to_model2 = models.ManyToManyField(Model2)
, ведь тоже попадают в результат выборки, так - как используется prefetch_related()?

Отредактировано MikaMika (Март 18, 2013 12:43:29)

Офлайн

#2 Март 22, 2013 22:01:06

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Оптимизация ORM, вьюхи и шаблоны.

Как работает prefetch_related() можно посмотреть в исходном коде Django

> Насколько я понимаю, что если я изменю запрос во вьюхе на:
> то никакой выгоды в количестве запросов к базе я не получу?

Тут не надо ничего понимать, тут надо просто смотреть количество запросов, например с помощью django-debug-toolbar

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version