在我的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`.`verb`, COUNT(`activity_activity`.`verb`) AS `count` FROM `activity_activity` GROUP BY `activity_activity`.`verb` ORDER BY NULL
但是当涉及到CASE_1时,注释功能按activity.id
对查询集进行分组,即
SELECT `activity_activity`.`verb`, COUNT(`activity_activity`.`verb`) AS `count` FROM `activity_activity` GROUP BY `activity_activity`.`id` ORDER BY `activity_activity`.`id` DESC`
注意 我需要基于 url 的 API 和聚合过滤数据
组之所以如此之小,是因为您在原始查询集上具有.order_by('-id')
。您可以通过空order_by或仅按分组中使用的字段排序来修复它:
if CASE_1:
queryset = queryset.values('verb').annotate(count=Count('verb')).order_by('verb')
阅读有关聚合 - 与默认排序或 order_by() 的交互的信息。