查找具有多个“子”对象的 Django 模型记录?

Kev*_*ell 3 python django django-models

如果我在 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)
Run Code Online (Sandbox Code Playgroud)

如何查找至少Parent有两条记录的所有记录?理想情况下,解决方案将在 上使用单个语句。Child.filter()Parent

Wil*_*sem 6

您可以注释 s 的数量Child,然后过滤该数字,例如:

from django.db.models import Count

Parent.objects.annotate(
    nchild=Count('child')
).filter(nchild__gt=1)
Run Code Online (Sandbox Code Playgroud)

这将生成如下查询:

SELECT parent.*, COUNT(child.id) AS nchild
FROM parent
LEFT OUTER JOIN child ON parent.id = child.parent_id
GROUP BY parent.id
HAVING COUNT(child.id) > 1
Run Code Online (Sandbox Code Playgroud)

人们可以将.filter(..)条件更改为有关 childs 数量的各种条件nchilds,例如nchild=4过滤Parent具有恰好四个子级的 s ,而~Q(nchild=7)将排除Parent具有恰好七个子级的所有 s 。因此我们可以制作更复杂的过滤器。