在django查询上组合值和注释

时间:2015-08-28 17:02:11

标签: python sql django

我有一个如下所示的查询:

filter = Q(filter stuff)
q = MyModel.objects.filter(filter).order_by().values('c1', 
                                                     'c2', 
                                                     'c3').annotate(Sum('c2'), Sum('c3'))

现在,当我这样做时,输出基本上具有c1c2c3的所有唯一三元组。我不想要的。我希望它找到c1的所有唯一值,并将c2c3的相应值相加。

我可以通过将查询更改为以下

来解决此问题
q = MyModel.objects.filter(filter).order_by().values('c1', 
                                                    ).annotate(Sum('c2'), Sum('c3'))

哪个好,给了我想要的输出......但是我不明白为什么......

values不应该指定我想要的列,而不是将输出限制为这些输出的唯一配对?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

  

现在,当我这样做时,输出基本上具有c1c2c3的所有唯一三元组。

values()将返回一个对象的特定c1c2c3字典作为字典。是的,这是预期的行为。

继续前进:

  

我希望它找到c1的所有唯一值,并将c2和c3的相应值相加。

好于:先使用值获取查询集中每个对象的c1值,然后使用注释添加' c2'的总和。和' c3'。 你做得很好。

是的,这是正确的:

q = MyModel.objects.filter(filter).order_by().values('c1', 
                                                    ).annotate(Sum('c2'), Sum('c3'))
  

不应该指定我想要的列,而不是限制   输出到这些输出的唯一配对?

在这种情况下,您想要的列是c1,您真的不想要列c2c3,您只想汇总它们。

values()将输出限制为唯一配对,因为这是数据库中的一行。 values()中没有魔法,只是将模型实例转换为字典。

希望它有所帮助。