1. 由于goods和goodscategory表都在一个model里, 所以这里的商品分类的逻辑也写在 goods.views.py里
2. 首先写serializers.py
from .models import GoodsCategory
# 商品类别接口的序列化 # 让goods的category字段全量显示 class CategorySerializer3(serializers.ModelSerializer): class Meta: model = GoodsCategory fields = "__all__" # 取所有字段 class CategorySerializer2(serializers.ModelSerializer): sub_cat = CategorySerializer3(many=True) # many=True, 即声明该字段有多个值 class Meta: model = GoodsCategory fields = "__all__" # 取所有字段 class CategorySerializer(serializers.ModelSerializer): sub_cat = CategorySerializer2(many=True) # many=True, 即声明该字段有多个值 class Meta: model = GoodsCategory fields = "__all__" # 取所有字段
3. 然后写goods.views.py 的 CategorysViewSet
from .serializers import CategorySerializer # 商品分类接口 # 需求: 一类里面嵌套二类, 二类里面嵌套三类 # RetrieveModelMixin的功能是帮我们完成url的配置, /categorys/id, 通过输入id就可以拿到指定的某个元素 class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin,viewsets.GenericViewSet): """ list: 商品分类列表数据 """ queryset = GoodsCategory.objects.filter(category_type=1) serializer_class = CategorySerializer
4. 最后去配置url, 原则上我们需要人为的为 "获取某一个分类的详情" 这个功能提供url, 但是前面使用的 RetrieveModelMixin 已经完全帮我们封装了这个功能
功能详情见下图
urls.py
from goods.views import CategoryViewSet # 配置category的url, 无需单独配置category/id的url router.register(r‘categorys‘, CategoryViewSet, basename="categorys") # router会自动把get转到list上,把post转到create上
5. 去浏览器验证
首先检查是否完成了循环嵌套, 然后验证是否可以单独取出某一个category, 见下图都没有问题
----- over --------
原文:https://www.cnblogs.com/jiangzongyou/p/12099252.html