Как правильно использовать 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)
Вернуться на верх