编程语言
首页 > 编程语言> > python – 目标的Django聚合

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