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
对象的查询呢?也就是说,我想知道每个销售人员的佣金(大致相当于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)
有没有一种方法可以通过单个查询来完成这个任务(让报告数据库服务器处理),而不是在我的应用程序服务器上进行操作?
Salesperson
模型中没有相关领域“sales”。(这是合乎逻辑的:销售应该是指向销售人员的外键,而不是反过来)。这个例子的目的是找到一个解决方案,在Sale
上进行查询,然后按照与Sale
的外键称为“fk_salesperson
”相关的字段分组。 - Escherrelated_name
属性,以便给它一个有意义的名称。如果您没有设置一个,我认为它应该是sale_set__
而不是sales__
。 - Antoine PinsardSELECT SUM( (sale_price-cost_price) * commission_rate) FROM Sales GROUP BY Salesperson
)。是否有更符合 Python 风格的方式,更好地反映原始 SQL 的简洁性? - Escher