【问题标题】:Django - Get count of child objects associated with the Parent objectDjango - 获取与父对象关联的子对象的计数
【发布时间】:2021-04-27 12:04:28
【问题描述】:

我正在尝试获取与父对象关联的现有子对象的计数。

我有一个父模型,例如:

class ParentObj(models.Model):
    name = models.CharField(verbose_name='Name', max_length=50)

现在我有了这些子模型。

class ChileObj1(models.Model):
    parent = models.ForeignKey(Product)
    name = models.CharField(verbose_name='Name', max_length=50)

class ChileObj2(models.Model):
    parent = models.ForeignKey(Product)
    name = models.CharField(verbose_name='Name', max_length=50)

class ChileObj3(models.Model):
    parent = models.ForeignKey(Product)
    name = models.CharField(verbose_name='Name', max_length=50)

现在父对象可能只有两个子对象,而不是 3 个。 如何使用查询获得它们的计数。

TIA

【问题讨论】:

  • 这些ChileObj1ChileObj2的架构完全相同吗?如果是这样,为什么不将它们仅保留为 one 模型?
  • @AbdulAzizBarkat 他们完全不同。

标签: django django-models


【解决方案1】:

使用Count function [Django docs]注释子对象的计数,然后将它们添加到另一个注释中。

from django.db.models import Count, F

queryset = ParentObj.objects.annotate(
    child1_count=Count('chileobj1', distinct=True),
    child2_count=Count('chileobj2', distinct=True),
    child3_count=Count('chileobj3', distinct=True),
).annotate(child_count=F('child1_count') + F('child2_count') + F('child3_count'))

for parent in queryset:
    print(parent.name, parent.child_count)

注意distinct=True 部分在这里很重要,因为此查询会生成一个对 多个表 的连接,这可以给出 结果与聚合不一致。这适用于Count 但对于其他聚合,我们需要使用子查询来做到这一点 注释。

【讨论】:

  • 我认为,OP 想做 group byParentObj.objects.values("id").annotate(...)
  • @NKSM 聚合函数与相关模型自动执行分组查询。尝试print(queryset.query) 查看将为查询集运行的查询。这样我们还有一个额外的好处,就是我们实际上是从查询集而不是字典中获取模型实例。
【解决方案2】:

您可以像这样制作 viewSet 和迭代父模型:

querySet = Parent.objects.all()

然后创建一个 def 来返回每个孩子的计数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2021-01-25
    • 2020-09-11
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多