是否可以使用 django ORM 对聚合查询进行 GROUP BY?
Is it possible to GROUP BY an aggregate query with 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')
))
我正在尝试计算 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')
))