在我的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和聚合的过滤数据
答案 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()。