django annotate奇怪的行为(group by model.id)

时间:2017-11-07 02:29:30

标签: django python-3.x django-orm django-aggregation django-annotate

在我的DRF API中,我有一个像这样的视图

class ActivityAPI(viewsets.ModelViewSet):
    authentication_classes = (SessionAuthentication, TokenAuthentication)
    serializer_class = ActivitySerializer
    queryset = Activity.objects.order_by('-id').all()
    filter_backends = (DjangoFilterBackend,)
    filter_class = ActivityFilter
    filter_fields = ('name', 'ack', 'developer', 'ack_date', 'ack_by', 'verb')    

    def get_count(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        if CASE_1:
            queryset = queryset.values('verb').annotate(count=Count('verb'))
        if CASE_2:
            queryset = Activity.objects.values('verb').annotate(count=Count('verb'))
        return Response(data=queryset)

CASE_2 中,我得到了我所期望的等同于SQL查询SELECT activity_activity .动词, COUNT( activity_activity .动词{{ 1}} count ) AS activity_activity FROM activity_activity GROUP BY动词.

当它来到 CASE_1 ,annotate功能按ORDER BY NULL对查询集进行分组,即activity.id activity_activity SELECT动词. activity_activity , COUNT(动词. count {{ 1}} activity_activity ) AS activity_activity FROM id GROUP BY activity_activity . id ORDER BY

注意我需要基于URL的API和聚合的过滤数据

1 个答案:

答案 0 :(得分:1)

这是因为您在原始查询集上有.order_by('-id')。您可以通过空的或兼容的order_by来修复它:

if CASE_1:
    queryset = queryset.values('verb').annotate(count=Count('verb')).order_by('verb')

了解Aggregation - Interaction with default ordering or order_by()