Я думаю, что сама документация не требует пояснений.
Вы можете достичь того же результата в,
Метод-1
from django.db.models import FilteredRelation, Q
result_1 = Restaurant.objects.annotate(pizzas_vegetarian=FilteredRelation('pizzas', condition=Q(pizzas__vegetarian=True), ), ).filter(
pizzas_vegetarian__name__icontains='mozzarella')
Метод-2
result_2 = Restaurant.objects.filter(pizzas__vegetarian=True, pizzas__name__icontains='mozzarella')
Вы получите лучшую производительность с Метод-1 , поскольку фильтрация в WHERE Предложение первого набора запросов будет работать только для вегетарианской пиццы.
ОБНОВЛЕНИЕ
Django # 29555 Билет содержит больше информации об использовании и производительности.
FilteredRelation()
не только повышает производительность, но и создает правильные результаты при агрегировании с несколькими LEFT JOIN
с.