注释后的 Django group by 不起作用

问题描述 投票:0回答:1

我有以下 Django 模型:

class Order(models.Model):
    ...
    org_slug = models.CharField()

class ProductToOrder(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    qty = models.IntegerField()
    cost = models.FloatField()

我需要对 org_slug 上分组的订单进行求和,并且它必须具有只有一个 ProductToOrder 且 ProductToOrder.qty=1 的订单总和

我正在尝试这样做

        orders = Order.objects.filter(
            some_filter_here
        ).values('org_slug').annotate(
            order_sum=Subquery(Order.objects.filter(
                org_slug=OuterRef('org_slug')).annotate(
                    product_count=Coalesce(Sum('producttoorder__qty'), 1)
        ).filter(product_count=1).values('org_slug').annotate(
            sum=Sum('producttoorder__cost')
        ).values('sum')[:1]))

但它返回所有订单的查询集。例如,如果我有 1000 个订单和 2 个 org_slugs,我需要在查询列表中获取 2 个对象,但它返回 1000。我尝试在以下子查询中按查询集进行分组的这一行不起作用:

.filter(product_count=1).values('org_slug')

我尝试了很多不同的查询集来修复它,但它没有给我任何积极的结果。我只看到一种修复它的方法,我需要在订单模型中创建 qty 字段,但我希望还有其他方法可以修复它。有人可以帮我吗?

django group-by annotate
1个回答
0
投票

我认为你把事情过于复杂化了。您可以与:

from django.db.models import Sum

Order.objects.filter(org_slug=my_slug, producttoorder__qty=1).annotate(
    total=Sum('producttoorder__cost')
)

这将检索具有

Order
org_slug=my_slug
对象,并对所有相关
cost
ProductToOrder
进行求和。

但是这里有一个警告:如果有 多个

ProductToOrder
qty=1
,它也会进行总结。如果您想省略这些,我们可以与:

from django.db.models import Count, Exists, OuterRef, Sum

Order.objects.filter(
    ~Exists(ProductToOrder.objects.filter(~Q(qty=1), order_id=OuterRef('pk'))),
    org_slug=my_slug,
    producttoorder__qty=1,
).annotate(total=Sum('producttoorder__cost'), num=Count('producttoorder')).filter(
    num=1
)

因此,这将仅考虑具有

Order
one
ProductToOrder
qty=1

© www.soinside.com 2019 - 2024. All rights reserved.