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

Django开发:如何合并同一父分类标题下的子分类至同一列表,以及如何检查列表是否已创建或通过过滤方法获取指定格式响应?

解决Django API中合并同父分类子分类的问题

你的核心问题是当前代码每次循环都会生成一个新的父分类字典,导致相同父分类被拆分成多个独立条目。下面给你两种可行的解决方案,同时解答你的疑问:

方法一:Python字典手动分组(兼容所有数据库)

修改你的views.py代码,用一个中间字典按父分类标题分组子分类,避免重复创建条目:

class getCategoriesAPIView(APIView):
    def get(self, request):
        queryset = SubCategory.objects.all()
        # 用字典存储父分类标题和对应的子分类列表
        category_map = {}
        
        for item in queryset:
            parent_title = item.category.title
            sub_title = item.sub_title
            
            # 检查当前父分类是否已存在(即对应的子分类列表是否已创建)
            if parent_title in category_map:
                # 已存在,直接追加子分类
                category_map[parent_title].append(sub_title)
            else:
                # 不存在,创建新列表并添加当前子分类
                category_map[parent_title] = [sub_title]
        
        # 将字典转换为你需要的列表格式
        result = [{category: subs} for category, subs in category_map.items()]
        return JsonResponse(result, safe=False)

关键逻辑说明:

  • category_map作为中间容器,键是父分类标题,值是该分类下的子分类列表
  • 循环时通过if parent_title in category_map判断列表是否已创建,避免重复生成父分类条目
  • 最后用列表推导式把字典结构转换成你需要的[{父分类: [子分类列表]}]格式

方法二:Django ORM聚合查询(更高效,依赖PostgreSQL)

如果你的项目使用PostgreSQL,可以利用Django的ArrayAgg聚合函数,直接在数据库层面完成分组,减少Python代码的循环开销:

from django.db.models import ArrayAgg

class getCategoriesAPIView(APIView):
    def get(self, request):
        # 从Category模型出发,聚合对应的子分类标题
        queryset = Category.objects.annotate(
            sub_categories=ArrayAgg('subcategory__sub_title')
        ).values('title', 'sub_categories')
        
        # 转换为目标格式
        result = [{item['title']: item['sub_categories']} for item in queryset]
        return JsonResponse(result, safe=False)

优势:

  • 数据库层面完成分组和聚合,性能更优,尤其是数据量较大时
  • 代码更简洁,减少手动循环的出错概率

对你疑问的解答:

  1. 如何检查列表是否已创建?:方法一中的if parent_title in category_map就是检查对应父分类的子分类列表是否存在,存在则追加,不存在则创建新列表。
  2. 是否有过滤方法获取目标格式?:方法二就是用ORM的聚合和过滤(如果需要过滤特定父分类,可以在Category.objects.filter()中添加条件,比如filter(title__contains="News")),直接得到分组后的结果,再转换为目标格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:57:33