Как правильно использовать prefetch_related в django
Один запрос выполняется более чем в 10 раз быстрее другого, похоже, что prefetch_related не имеет никакого эффекта. Как правильно это сделать?
# 400ms
test = PZItem.objects.all().aggregate(Sum('quantity'))
# 4000ms
test = PZ.objects.prefetch_related('pzitem_set').aggregate(Sum('pzitem__quantity'))
.aggregate
уже является функцией базы данных. Нет необходимости в предварительной выборке всех связанных элементов.
Вам нужна prefetch_related, например, если вы выполняете итерации над элементами
from django.models.db import Prefetch
test = PZ.objects.all().prefetch_related(
Prefetch(
'pzitem_set',
queryset=PZItem.objects.filter(active=True), # optional qs filter
to_attr='pzitem_list'
)
)
# version 1 with prefetch
for pz in test:
for item in pz.pzitem_list:
# this does NOT hit the db everytime as the pzitem_list is prefetched
print(item)
# version 2 without prefetch
for pz in test:
for item int ps.pzitem_set.all():
# this will hit the database for every pz in the parent loop
print(item)