python – 目标的Django聚合
作者:互联网
我在商店里保存每件商品.我希望使用聚合来汇总每个商店一个月内的所有销售额.我想过滤达到目标的商店(100.000 $).
我已经想出了一个使用python和列表的解决方案.但我想知道是否有更好的解决方案只使用ORM.
Sales model
Store Sale Date
Store A 5.000 11/01/2014
Store A 3.000 11/01/2014
Store B 1.000 15/01/2014
Store C 8.000 17/01/2014
...
结果应该是这样的:
Month: January
Store Amount
A 120.000
B 111.000
C 150.000
and discard
D 70.000
谢谢你的帮助.
解决方法:
其他建议的方法会丢弃大量需要几分之一秒加载的数据,这在以后的代码中可能会有用.因此这个答案.
您可以在Store对象上查询,而不是查询Sales对象.除了关系之外,查询大致相同:
from django.db.models import Sum
stores = Store.objects.filter(sales__date__month=month, sales__date__year=year) \
.annotate(montly_sales=Sum('sales__amount')) \
.filter(montly_sales__gte=100000) \
# optionally prefetch all `sales` objects if you know you need them
.prefetch_related('sales')
>>> [s for s in stores]
[
<Store object 1>,
<Store object 2>,
etc.
]
所有Store对象都有一个额外的属性montly_sales,该属性具有该特定月份的总销售额.通过在注释之前过滤月份和年份,注释仅使用过滤的相关对象.请注意,商店中的sales属性仍包含该商店的所有销售额.
使用此方法时,可以轻松访问所有商店属性,这与使用.values对结果进行分组时不同.
标签:python,django,django-orm 来源: https://codeday.me/bug/20190830/1771741.html