django - 如何找到相关对象的相关对象的聚合计数最小计数?
问题描述
我有这样的关系模型:
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()
,但请尽可能解释,我可以用多个聚合重现。
解决方案
获得 Min 或 Max 的一种解决方案是使用这样的 SubQuery:
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))
它不是聚合的,但它会为您提供 Min/Max。
推荐阅读
- django - 如何用graphene.filter过滤
- .net-core - 为什么解决方案文件不是 XML 格式?
- java - 当将值传递给 DualHashBidiMap 的 getKey 方法时,我得到了空值。即使它存在……?
- html - 如何使用 vuetify 对齐列表项(1.5)
- cherrypy - CherryPy 是否在其服务器中很好地支持启用长轮询的路径?
- c++ - 如何将 Android 的外部音频库集成到 Qt 中?朱思?超能力?
- r - 将 x 标签格式化为 %d/%m
- database - 有没有办法根据条件添加到表中?
- eiffel - 如何在 Eiffel 中运行游标树?
- c# - 在某个时间点写入 .txt 文件