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

如何在Django中按category字段对Selection查询集分组?

在Django/DRF中按Category分组重组响应结构

完全可以在Django端完成你需要的分组操作,下面提供几种实用的实现方式:

方法一:视图中手动构建分组结构(简单直接)

适合数据量不大的场景,直接查询数据后遍历重组字典:

from django.http import JsonResponse
from .models import Selection

def grouped_selections(request):
    # 只查询需要的字段,减少数据传输
    selections = Selection.objects.all().values('id', 'category', 'products', 'created_at')
    grouped_data = {}
    
    for item in selections:
        # 弹出category字段作为分组键
        category = item.pop('category')
        # 初始化分组列表(如果不存在)
        if category not in grouped_data:
            grouped_data[category] = []
        # 将当前条目加入对应分组
        grouped_data[category].append(item)
    
    return JsonResponse(grouped_data)

方法二:结合DRF序列化器实现

如果你的项目已经使用Django REST Framework,可以在视图中重写响应逻辑:

1. 定义序列化器

from rest_framework import serializers
from .models import Selection

class SelectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Selection
        fields = ['id', 'category', 'products', 'created_at']

2. 编写DRF视图

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Selection
from .serializers import SelectionSerializer

class GroupedSelectionView(APIView):
    def get(self, request):
        queryset = Selection.objects.all()
        # 用序列化器处理模型数据
        serializer = SelectionSerializer(queryset, many=True)
        grouped_data = {}
        
        for item in serializer.data:
            category = item.pop('category')
            if category not in grouped_data:
                grouped_data[category] = []
            grouped_data[category].append(item)
        
        return Response(grouped_data)

方法三:使用itertools.groupby分组

需要先对查询集按category排序,确保分组正确:

from itertools import groupby
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Selection
from .serializers import SelectionSerializer

class GroupedSelectionView(APIView):
    def get(self, request):
        # 必须先按category排序,否则groupby无法正确分组
        queryset = Selection.objects.order_by('category')
        serializer = SelectionSerializer(queryset, many=True)
        grouped_data = {}
        
        # 按category字段分组
        for category, group in groupby(serializer.data, key=lambda x: x['category']):
            # 移除每个条目的category字段并收集到列表中
            grouped_data[category] = [
                {k: v for k, v in item.items() if k != 'category'} 
                for item in group
            ]
        
        return Response(grouped_data)

以上几种方式都能实现你需要的响应结构,避免前端额外处理数据。如果数据量较大,建议先通过values()指定需要的字段,减少不必要的数据传输。

内容的提问来源于stack exchange,提问作者gianlop3z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:24:47