Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django批注无法使用order_by_Django_Django Models - Fatal编程技术网

Django批注无法使用order_by

Django批注无法使用order_by,django,django-models,Django,Django Models,我想在('-end_date')之前获得MyModel order_的最后100条记录,并对不同的赢家类型进行总和注释 MyModel.objects.all()[:100].order_by('-end_game_time').values('winner').annotate(total=Count('winner')) 结果查询如下,我没有预期的组 <QuerySet [{'winner': 3, 'total': 1}, {'winner': 15, 'total': 1}, '

我想在('-end_date')之前获得MyModel order_的最后100条记录,并对不同的赢家类型进行总和注释

MyModel.objects.all()[:100].order_by('-end_game_time').values('winner').annotate(total=Count('winner'))
结果查询如下,我没有预期的组

<QuerySet [{'winner': 3, 'total': 1}, {'winner': 15, 'total': 1}, 'total': 1}, {'winner': 3, 'total': 1}, {'winner': 5, 'total': 1}, {'winner': 15, 'total': 1}, {'winner': 5, 'total': 1}, {'winner': 3, 'total': 1}, '...(remaining elements truncated)...']>
但是当我没有订单时,结果正如我所预料的

MyModel.objects.all()[:100].values('winner').annotate(total=Count('winner'))
Out[52]: <QuerySet [{'winner': 5, 'total': 43}, {'winner': 1, 'total': 2}, {'winner': 15, 'total': 51}, {'winner': 2, 'total': 42}, {'winner': 3, 'total': 43}]>

据我所知,不可能在单个查询中实现您想要做的事情,您想要在SQL中实现的是:

SELECT "game_mymodel"."winner", COUNT("game_mymodel"."winner") AS "total" FROM "game_mymodel" GROUP BY "game_mymodel"."winner" ORDER BY "game_mymodel"."end_game_time" DESC LIMIT 100
这不是一个有效的sql查询,因此您需要有一个子查询来选择100个元素,然后对它们应用聚合

首先构建子查询:

top_100_games = MyModel.objects.order_by('-end_game_time')[:100].only('id').all()
然后在主查询中使用它:

MyModel.objects.filter(id__in=top_100_games).values('winner').annotate(total=Count('winner'))
top_100_games = MyModel.objects.order_by('-end_game_time')[:100].only('id').all()
MyModel.objects.filter(id__in=top_100_games).values('winner').annotate(total=Count('winner'))