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

2024-10-01 02:22:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下两行代码

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查询生成一个对象的querylist,其中类别排在第一位,其次是revenue。所以基本上:

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

另一方面,sum查询会产生收入,然后是类别,因此基本上:

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

到目前为止,我已经尝试过翻转查询并更改变量名,但我似乎无法理解为什么这两个语句的行为如此不同。有人知道什么会影响Django的注释行为吗?你知道吗

编辑: 如果您想知道为什么我需要理解这一点:我将queryset传递给一个方法,该方法将它转换为用于生成条形图的数据,并且数据集中的第一个对象必须是值的标识符。我可以通过检查这是否真的是这样,或者用其他方法使整个过程颠倒过来,但在我看来,这是不必要的


Tags: 对象方法bytitleorder类别totalcategories
1条回答
网友
1楼 · 发布于 2024-10-01 02:22:25

这与annotate几乎没有关系。Python中的字典没有常规意义上的排序(至少在python3.6之前是这样),而且键可以在不同的queryset结果之间进行不同的排序。你知道吗

这几乎不构成问题,因为您将通过键而不是序列(如序列)访问所需的值:

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

如果plot函数采用dict,则无需担心排序问题。你知道吗

相关问题 更多 >