我必须遗漏一些明显的东西,因为这个简单的要求的行为并不像预期的那样。这是我的模型类:
class Encounter(models.Model):
activity_type = models.CharField(max_length=2,
choices=(('ip','ip'), ('op','op'), ('ae', 'ae')))
cost = models.DecimalField(max_digits=8, decimal_places=2)
我想查找每种活动类型的总费用。我的疑问是:
>>> Encounter.objects.values('activity_type').annotate(Sum('cost'))
哪个收益率:
>>> [{'cost__sum': Decimal("140.00"), 'activity_type': u'ip'},
{'cost__sum': Decimal("100.00"), 'activity_type': u'op'},
{'cost__sum': Decimal("0.00"), 'activity_type': u'ip'}]
在结果集中有2个'ip'类型遇到。这是因为它不仅仅由activity_type
分组,而是由 activity_type AND cost 分组,但不会产生预期的结果。生成的SQL查询是:
SELECT "encounter_encounter"."activity_type",
SUM("encounter_encounter"."total_cost") AS "total_cost__sum"
FROM "encounter_encounter"
GROUP BY "encounter_encounter"."activity_type",
"encounter_encounter"."total_cost" <<<< THIS MESSES THINGS
ORDER BY "encounter_encounter"."total_cost" DESC
如何使此查询按预期工作(如果我没有弄错的话,docs隐含的话),并且只在activity_type
上进行分组?
答案 0 :(得分:11)
正如@Skirmantas正确指出的那样,问题与order_by
有关。虽然在查询中没有明确说明,但是模型的Meta类中的默认排序被添加到查询中,然后将其添加到group by子句中,因为SQL需要这样。
解决方案是删除默认排序或添加空order_by()
以重置排序:
>>> Encounter.objects.values('activity_type').annotate(Sum('cost')).order_by()