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)
优势:
- 数据库层面完成分组和聚合,性能更优,尤其是数据量较大时
- 代码更简洁,减少手动循环的出错概率
对你疑问的解答:
- 如何检查列表是否已创建?:方法一中的
if parent_title in category_map就是检查对应父分类的子分类列表是否存在,存在则追加,不存在则创建新列表。 - 是否有过滤方法获取目标格式?:方法二就是用ORM的聚合和过滤(如果需要过滤特定父分类,可以在
Category.objects.filter()中添加条件,比如filter(title__contains="News")),直接得到分组后的结果,再转换为目标格式。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

