Django с фильтрованным соединением

#django

#django

Вопрос:

У меня есть внутреннее соединение:

 SELECT c.name, b.name FROM company c
INNER JOIN branch b ON b.company_id = c.id
WHERE c.id = 5 AND b.employees > 10;
 

Что я получил 3 регистра.

Как мне сделать этот запрос в Django, чтобы возвращать только 3 регистра?

 c = Company.objects.prefetch_related("comp_branches").filter(id=5, comp_branches__employees__gt=10)
c[0].comp_branches.all()  # returns 5 registers
 

Ответ №1:

Вы можете использовать Prefetch объект [Django-doc]:

 from django.db.models import Prefetch

c = Company.objects.prefetch_related(
    Prefetch('comp_branches', Branch.objects.filter(employees__gte=10))
).filter(id=5) 

Вот Brach модель, на которую нацелен comp_branches , поэтому это может быть по-другому.

Если вы .filter() , вы не фильтруете связанные объекты, которые вы предварительно выбираете, поскольку это делается в отдельном запросе. Это comp_brances__employees__gte=10 удалит только Company s из тех QuerySet , у которых нет brach с 10 или более сотрудниками.