python - 是否可以使用 django ORM 对聚合查询进行 GROUP BY?

标签 python django django-orm

我正在尝试计算 SELECT SUM(...) FROM ... GROUP BY ... 的等价物。这是一个简化的类比:

假设 Salesperson 对象销售东西并从他们通过每次 Sale 产生的利润中获得佣金:

sp = Salesperson.objects.get(pk=1)
my_sales = Sale.objects.filter(fk_salesperson=sp)

#calculate commission owing to sp
commission = 0
for sale in my_sales:
    commission += sp.commission_rate\
                     * (sale.selling_price - sale.cost_price)

最后一个循环可以这样完成:

.annotate( commission= ( F('selling_price')-F('cost_price') )\
                            * sp.commission_rate )

但是我可以进一步聚合所有 Salesperson 对象的查询吗? IE。我想知道每个 销售人员的佣金(即大致SELECT SUM( (sale_price-cost_price) * commission_rate) FROM Sales GROUP BY Salesperson)。我可以做类似下面的事情,但我正在尝试用 ORM 来做:

commissions = []
salespeople = Salesperson.objects.all()
for sp in salespeople:
    data = Sale.objects.filter(fk_salesperson=sp)\
       .annotate(salesperson=F('sp__email')\
       .annotate(commission= ( F('selling_price')-F('cost_price') )\
                                 * sp.commission_rate )
    commissions.append(data)

有没有办法通过单个查询(让报告数据库服务器完成工作)而不是在我的应用程序服务器上执行此操作?

最佳答案

Sum() 聚合函数在 django.db.models 中可用,您可以在 F 表达式中使用相关字段。

from django.db.models import F, Sum

Sales.objects.values('salesperson__id').annotate(commission=Sum(
    (F('selling_price') - F('cost_price')) * F('salesperson__commission_rate')
))

关于python - 是否可以使用 django ORM 对聚合查询进行 GROUP BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38008466/

相关文章:

python - 如何将特定于环境的应用程序配置传递给 Pytest

Django 外键打破多表继承

django 的 .extra(where= 子句被表重命名 .filter(foo__in=... subselects

python - 用于coverage.py的setuptools命令

python - 使用 rpy2 从 python 获取部分 R 对象

python - 比较两个字典的键并使用与另一个字典中的键不匹配的键、值对创建一个字典 - Python

python - Django,如何从主静态文件夹中的模板扩展

python - 通过 sendgrid-python API lib 将 django 对象上下文传递给 sendgrid 电子邮件

Django ORM : get the monthly average of price for each category

python - Django 查询集的自定义过滤器