【问题标题】:How to find an aggregate count min count of related objects of related objects?如何找到相关对象的相关对象的聚合计数最小计数?
【发布时间】:2019-01-12 22:19:42
【问题描述】:

我有这样的关系模型:

Parent(models.Model):
    pass

Child(models.Model):
   parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

Grandchild(models.Model):
   child = models.ForeignKey(Child, on_delete=models.CASCADE)

我正在尝试找到一种方法来用孙子的总数来注释父查询集。

例如,假设有 2 个父母:(A, B)A 有 3 个孩子:(A.a, A.b, A.c)A.a 有 1 个孙子, A.b 有 2 个孙子, A.c 有3个孙子, B 有 2 个孩子:(B.a, B.b)B.a 有 2 个孙子。 B.b 有 3 个孙子。

我想用每个父母的每个孩子的孙子计数的聚合来注释父查询集。例如。与Min 聚合为A:1, B:2 或与Avg 聚合为A:2, B:2.5

我相信这可能需要.extra 来完成,但我不确定。

如果聚合函数是硬编码的就好了,即Parent.objects.all().annotate_min_ngc_per_c(),但请尽你所能解释我可以使用多个聚合进行复制。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    获得最小值或最大值的一种解决方案是使用这样的子查询:

    counts = Child.objects.filter(parent=OuterRef('pk'))
    counts = counts.annotate(num_grandchildren=Count('grandchild_set'))
    counts = counts.order_by('-num_grandchildren').values('num_grandchildren')[:1]
    qs = Parent.objects.annotate(min_num_grandchildren=Subquery(counts))
    

    它不是聚合的,但它会得到你的最小值/最大值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2012-05-13
      • 2022-12-16
      • 2019-07-12
      • 2017-09-12
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多