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

如何在Django REST Framework中按层级展示父分类下的子分类

层级分类数据展示解决方案

核心实现思路

通过DRF嵌套序列化器逐层关联,从最底层的Root-Item向上嵌套到Sub-Category、Category,最终关联到Master-Category,实现层级化数据输出;同时通过预加载关联数据优化查询性能。

适配你的模型结构(基于常见外键关联假设,需和你的Model.py对应调整)

假设你的模型关联逻辑如下,若实际字段/关联名不同,需同步修改后续代码:

from django.db import models

class MasterCategory(models.Model):
    name = models.CharField(max_length=100)
    # 其他自定义字段

class Category(models.Model):
    master_category = models.ForeignKey(MasterCategory, on_delete=models.CASCADE, related_name='categories')
    name = models.CharField(max_length=100)
    # 其他自定义字段

class SubCategory(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='sub_categories')
    name = models.CharField(max_length=100)
    # 其他自定义字段

class RootItem(models.Model):
    sub_category = models.ForeignKey(SubCategory, on_delete=models.CASCADE, related_name='root_items')
    name = models.CharField(max_length=100)
    # 其他自定义字段

修改Serializers.py实现层级序列化

从底层到顶层逐层嵌套序列化器,关联对应层级的数据:

from rest_framework import serializers
from .models import MasterCategory, Category, SubCategory, RootItem

class RootItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = RootItem
        fields = ['id', 'name']  # 按需指定返回字段,或用__all__返回全部

class SubCategorySerializer(serializers.ModelSerializer):
    root_items = RootItemSerializer(many=True, read_only=True)

    class Meta:
        model = SubCategory
        fields = ['id', 'name', 'root_items']

class CategorySerializer(serializers.ModelSerializer):
    sub_categories = SubCategorySerializer(many=True, read_only=True)

    class Meta:
        model = Category
        fields = ['id', 'name', 'sub_categories']

class MasterCategorySerializer(serializers.ModelSerializer):
    categories = CategorySerializer(many=True, read_only=True)

    class Meta:
        model = MasterCategory
        fields = ['id', 'name', 'categories']

修改Viewset.py优化查询性能

通过预加载所有层级关联数据,避免N+1查询问题:

from rest_framework import viewsets
from .models import MasterCategory
from .serializers import MasterCategorySerializer

class MasterCategoryViewSet(viewsets.ReadOnlyModelViewSet):
    # 若需支持增删改,替换为ModelViewSet
    queryset = MasterCategory.objects.prefetch_related(
        'categories__sub_categories__root_items'
    ).all()
    serializer_class = MasterCategorySerializer

关键注意事项

  • 确保模型中related_name的取值和序列化器中使用的字段名完全一致,否则无法正确关联数据。
  • 若需支持层级数据的创建/更新,需重写序列化器的create或update方法,手动处理嵌套数据的保存逻辑。
  • 数据量较大时,prefetch_related是提升接口响应速度的关键,务必添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:09:21