Найти - Пользователи
Полная версия: Оптимизация ORM, вьюхи и шаблоны.
Начало » Django » Оптимизация ORM, вьюхи и шаблоны.
1
MikaMika
Привет.
У меня вопрос по поводу оптимизации, 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()?
lorien
Как работает prefetch_related() можно посмотреть в исходном коде Django

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

Тут не надо ничего понимать, тут надо просто смотреть количество запросов, например с помощью django-debug-toolbar
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