Django注释模型具有基于查询的汇总值



假设我有以下模型结构:

Parent():
Child():
parent = ForeignKey(Parent)
GrandChild():
child = ForeignKey(Child)
state = BooleanField()
num = FloatField()

我试图从父级ViewSet那里恢复以下内容:

  1. 儿童人数。
  2. 当"状态"为真时," num"字段的总和。

我可以做以下操作:

queryset = Parent.objects
    .annotate(child_count=Count('child'))
    .annotate(sum_total=Sum('child__grandchild__num'))

这给了我(1),但是(2)它给了我所有孙子的款项。在确保我将所有 Parent对象仍然存在的同时,我如何适当过滤孙子?

您正在使用哪个版本的Django?如果支持版本,您也可以使用子查询。

from django.db.models import OuterRef, Subquery
Parent.objects
.annotate(child_count=Count('child'))
.annotate(
    grandchild_count_for_state_true=Subquery(
        GrandChild.objects.filter(
            state=True,
            child=OuterRef('pk')
        ).values('parent')
        .annotate(cnt=Sum('child__grandchild__num'))
        .values('cnt'),
        num=models.IntegerField()
    )
)

您可以通过汇总查询来优化它。

在注释之前尝试使用过滤器

queryset = Parent.objects.filter(child__grandchild__state='True')
    .annotate(child_count=Count('child'))
    .annotate(sum_total=Sum('child__grandchild__num'))

您可以执行以下操作:

qs = Parents.objects.all()
child_count = Count('children')
num_sum = Sum('children__grandchildren__num', filter=Q(children__grandchildren__state=True))
qs = qs.annotate(child_count=child_count).annotate(num_sum=num_sum)

Chidlren和孙子是您可以在模型中定义的相关名称

最新更新