【问题标题】:Find Django model records that have more than one 'child' objects?查找具有多个“子”对象的 Django 模型记录?
【发布时间】:2019-01-29 21:25:46
【问题描述】:

如果我在 Django 中有两个模型,ParentChild,其中 ChildParent 有一个外键关系,如下所示:

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)

我怎样才能找到所有有至少两条Child记录的Parent记录?理想情况下,该解决方案将在 Parent 上使用单个 .filter() 语句。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您可以对Childs 的数量进行注释,然后对该数量进行过滤,例如:

    from django.db.models import Count
    
    Parent.objects.annotate(
        nchild=Count('child')
    ).filter(nchild__gt=1)

    这将生成如下查询:

    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

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

    【讨论】:

    • 正是我想要的!谢谢!
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多