Найти записи модели Django, которые имеют более одного «дочернего» объекта? - PullRequest
0 голосов
/ 30 января 2019

Если у меня есть две модели в Django, Parent и Child, где Child имеет отношение внешнего ключа к Parent, например:

class Parent(models.Model):
    parent_name = models.CharField(max_length=128, blank=False, default='no name')

class Child(models.Model):
    child_name = models.CharField(max_length=128, blank=False, default='no name')
    parent = models.ForeignKey('app.Parent', on_delete=models.CASCADE, null=False)

Как мне найти все Parent записей, которые имеют не менее двух Child записей?В идеале решение должно использовать один оператор .filter() для Parent.

1 Ответ

0 голосов
/ 30 января 2019

Вы можете аннотировать количество Child с и затем фильтровать по этому номеру, например:

from django.db.models import Count

Parent.objects.annotate(
    <b>nchild=Count('child')</b>
).filter(<b>nchild__gt=1</b>)

. Это сгенерирует запрос типа:

SELECT parent.*, COUNT(child.id) AS nchild
FROM parent
LEFT OUTER JOIN child ON parent.id = child.parent_id
GROUP BY parent.id
<b>HAVING COUNT(child.id) > 1</b>

Можноизмените условие .filter(..) на всевозможные условия по количеству дочерних элементов nchilds, например nchild=4 фильтры на Parent s с ровно четырьмя дочерними элементами, тогда как ~Q(nchild=7) исключит все Parent s с ровно семьюдети.Таким образом, мы можем создавать более сложные фильтры.

...