如何在Django中解决不一致的注释?

时间:2017-11-15 14:07:56

标签: python django

我有以下2行

CategoryContext = Somemodel.objects.values('title__categories__category').distinct()
CategoryContextSum = CategoryContext.annotate(Total_Revenue=Sum('revenue')).order_by('-Total_Revenue')
CategoryContextAvg = CategoryContext.annotate(Average_Revenue=Avg('revenue')).order_by('-Average_Revenue')

avg查询产生对象的查询列表,其中类别首先出现,然后是收入。所以基本上:

<QuerySet [{'title__categories__category':'Category', 'Average_Revenue':Decimal('100'),}, {'title__categories__category':'Category2':'Average_Revenue':Decimal('120'), }]>

另一方面,总和查询产生了类别后面的收入,所以基本上是:

<QuerySet [{'Total_Revenue':Decimal('100'), 'title__categories__category':'Category'}, {'Total_Revenue':Decimal('120'), 'title__categories__category':'Category2'}]>

现在我尝试翻转查询并更改变量名称到目前为止,但我似乎无法弄清楚为什么这两个语句的行为如此不同。有人知道什么会影响Django中的注释行为吗?

编辑: 如果您想知道为什么我需要理解这一点:我将查询集传递给一个方法,该方法将其转换为数据以生成条形图,并且数据集中的第一个对象必须是值的标识符。我可以做到这一点,通过检查是否确实是这种情况而反过来整个过程,而不是其他的,但在我看来,这不应该是必要的

1 个答案:

答案 0 :(得分:3)

这与annotate很少或没有任何关系。 Python中的字典没有传统的排序感(至少在Python 3.6之前),并且可以在不同的查询集结果中对键进行不同的排序。

这构成很少或没有问题,因为您将按键访问所需的值而不是连续访问(如序列):

for obj_dct in your_qs:
    print(obj_dct[some_key])

如果您的情节功能需要使用dicts,则无需担心订购。