You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:06:07