我有以下 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 字段,但我希望还有其他方法可以修复它。有人可以帮我吗?
我认为你把事情过于复杂化了。您可以与:
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
。