Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django和正值与负值分开_Python_Django_Orm_Django 2.0 - Fatal编程技术网

Python Django和正值与负值分开

Python Django和正值与负值分开,python,django,orm,django-2.0,Python,Django,Orm,Django 2.0,你能把正值和负值分开求和吗 我有一张这样的桌子: class Order(models.Model): date = models.DateField() amount = models.DecimalField() 我希望得到一个查询集,该查询集按周将正金额与负金额和组进行汇总: Year Week Sum of positive amounts Sum of negative amounts 我可以通过以下方式每周分别获得所有正金额: Order.objects.filt

你能把正值和负值分开求和吗

我有一张这样的桌子:

class Order(models.Model):
    date = models.DateField()
    amount = models.DecimalField()
我希望得到一个查询集,该查询集按周将正金额与负金额和组进行汇总:

Year
Week
Sum of positive amounts
Sum of negative amounts
我可以通过以下方式每周分别获得所有正金额:

Order.objects.filter(amount__gt=0).annotate(year_week=Trunc('date', 'week', output_field=DateField())).\
annotate(year=ExtractYear('year_week')).annotate(week=ExtractWeek('year_week')).\
values("year_week", "year", "week").annotate(value=Sum("amount")).order_by("-year_week")
对于负值,我可以再次这样做,但是我有两个独立的查询集。 我可以在不手动循环的情况下高效地合并它们吗?或者有没有一种方法可以在单个查询中同时执行这两种操作?

是的,因为大多数聚合函数都有:

从django.db.models导入Q,求和
从django.db.models.functions导入ExtractYear、ExtractWeek
顺序、对象、值(
年份=年份(“日期”),
周=提取周(“日期”)
).注释(
sum_pos=sum('amount',filter=Q(amount_gt=0)),
sum_neg=sum('amount',filter=Q(amount_lt=0))
).按('年'、'周')订购。
from django.db.models import Q, Sum
from django.db.models.functions import ExtractYear, ExtractWeek

Order.objects.values(
    year=ExtractYear('date'),
    week=ExtractWeek('date')
).annotate(
    sum_pos=Sum('amount', filter=Q(amount__gt=0)),
    sum_neg=Sum('amount', filter=Q(amount__lt=0))
).order_by('year', 'week')