我有一个如下所示的查询:
filter = Q(filter stuff)
q = MyModel.objects.filter(filter).order_by().values('c1',
'c2',
'c3').annotate(Sum('c2'), Sum('c3'))
现在,当我这样做时,输出基本上具有c1
,c2
和c3
的所有唯一三元组。我不想要的。我希望它找到c1
的所有唯一值,并将c2
和c3
的相应值相加。
我可以通过将查询更改为以下
来解决此问题q = MyModel.objects.filter(filter).order_by().values('c1',
).annotate(Sum('c2'), Sum('c3'))
哪个好,给了我想要的输出......但是我不明白为什么......
values
不应该指定我想要的列,而不是将输出限制为这些输出的唯一配对?任何帮助将不胜感激
答案 0 :(得分:2)
现在,当我这样做时,输出基本上具有
c1
,c2
和c3
的所有唯一三元组。
values()
将返回一个对象的特定c1
,c2
和c3
字典作为字典。是的,这是预期的行为。
继续前进:
我希望它找到c1的所有唯一值,并将c2和c3的相应值相加。
好于:先使用值获取查询集中每个对象的c1
值,然后使用注释添加' c2'的总和。和' c3'。
你做得很好。
是的,这是正确的:
q = MyModel.objects.filter(filter).order_by().values('c1',
).annotate(Sum('c2'), Sum('c3'))
不应该指定我想要的列,而不是限制 输出到这些输出的唯一配对?
在这种情况下,您想要的列是c1
,您真的不想要列c2
和c3
,您只想汇总它们。
values()
将输出限制为唯一配对,因为这是数据库中的一行。 values()
中没有魔法,只是将模型实例转换为字典。
希望它有所帮助。