Django Rest Framework实现按client_id分组嵌套结果并按id倒序排序
实现方案
你需要修改序列化器定义与视图层的分组逻辑,两步即可实现需求:
1. 调整serializers.py
新增分组序列化器,用来封装client_id和对应的问题列表:
from rest_framework import serializers from .models import QuestionsModel # 原有问题序列化器保留 class QuestionsSerializer(serializers.ModelSerializer): class Meta: model = QuestionsModel fields = '__all__' # 新增按client分组的序列化器 class ClientGroupSerializer(serializers.Serializer): client_id = serializers.IntegerField() questions = QuestionsSerializer(many=True)
2. 调整views.py逻辑
使用itertools.groupby做分组,注意分组前必须先按client_id排序,否则同一client的记录会被拆分到多个分组:
from rest_framework import generics from rest_framework.response import Response from itertools import groupby from .models import QuestionsModel from .serializers import ClientGroupSerializer class QuestionsAPIView(generics.ListAPIView): # 指定分组序列化器 serializer_class = ClientGroupSerializer def get_queryset(self): member_id = self.request.query_params.get('member_id') # 初始化为空查询集,避免返回字符串报错 queryset = QuestionsModel.objects.none() if member_id is not None and member_id.isnumeric(): # 先按client_id排序保证groupby正常,再按id倒序满足排序要求 queryset = QuestionsModel.objects.filter(member_id=member_id).order_by('client_id', '-id') return queryset def list(self, request, *args, **kwargs): queryset = self.get_queryset() # 按client_id分组聚合 grouped_data = [] for client_id, questions_group in groupby(queryset, key=lambda item: item.client_id): grouped_data.append({ "client_id": client_id, "questions": list(questions_group) }) serializer = self.get_serializer(grouped_data, many=True) return Response(serializer.data)
最终返回效果说明
你提供的期望JSON存在语法错误,修正后的规范返回结构如下,完全符合分组+倒序要求:
[ { "client_id": 500, "questions": [ { "id": 848485, "publication_id": 4445, "publication_title": "Title publication", "publication_link": "Link", "question": "This is a test question", "member_id": 123456, "client_id": 500 }, { "id": 848484, "publication_id": 4444, "publication_title": "Title publication", "publication_link": "Link", "question": "This is a test question", "member_id": 123456, "client_id": 500 } ] } ]
内容的提问来源于stack exchange,提问作者JuanCruz
相关产品推荐
相关产品推荐

