zoukankan      html  css  js  c++  java
  • drf 三级菜单后台序列化以及数据库的设计

    第一种,

    model.py结构:

    class GoodsCategory(models.Model):
        """
        商品类别
        """
        CATEGORY_TYPE = (
            (1, "一级类目"),
            (2, "二级类目"),
            (3, "三级类目"),
        )
        name = models.CharField(default="", max_length=30, verbose_name="类别名", help_text="类别名")
        code = models.CharField(default="", max_length=30, verbose_name="类别code", help_text="类别code")
        desc = models.TextField(default="", verbose_name="类别描述", help_text="类别描述")
    category_type
    = models.IntegerField(choices=CATEGORY_TYPE, verbose_name="类目级别", help_text="类目级别") parent_category = models.ForeignKey("self", null=True, blank=True, verbose_name="父类目级别", help_text="父目录", related_name="sub_cat")

    看下这个视图设置,

    class CategoryView(ListAPIView):
        '''
        全部分类
        '''
        queryset = GoodsCategory.objects.filter(category_type=1)
        serializer_class = CategorySerializer

    第二种:

    也可以这样设计数据库:

    class GoodsCategory(BaseModel):
     # """
     # 商品类别
     # """
        name = models.CharField(max_length=10, verbose_name='名称')
        parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name='⽗类别',related_name='sub_cat')
        class Meta:
            db_table = 'tb_goods_category'
            verbose_name = '商品类别'
            verbose_name_plural = verbose_name
        def __str__(self):
            return self.name

    视图这样写:

    class CategoryInfoView(mixins.ListModelMixin,GenericAPIView):
        queryset = GoodsCategory.objects.filter(parent=None)
        serializer_class = CategorySerializer
        def get(self,request):
            return self.list(request)

    因为第一级目录的父级是None,然后以这个为条件实现查询,有点像三级联动数据库的设计

    序列化实现充分用的是数据库反查,related_name设置。

    from rest_framework import serializers
    from .models import GoodsCategory
    
    class CategorySerializer3(serializers.ModelSerializer):
        class Meta:
            model = GoodsCategory
            fields = "__all__"
    
    
    class CategorySerializer2(serializers.ModelSerializer):
        sub_cat = CategorySerializer3(many=True)
        class Meta:
            model = GoodsCategory
            fields = "__all__"
    
    
    class CategorySerializer(serializers.ModelSerializer):
        sub_cat = CategorySerializer2(many=True)
        class Meta:
            model = GoodsCategory
            fields = "__all__"

     数据结构如下展示:

  • 相关阅读:
    报错:无法截断表 '某表',因为该表正由 FOREIGN KEY 约束引用
    如何选择使用结构或类
    C#交换两个变量值的多种写法
    什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
    把数据库中有关枚举项值的数字字符串转换成文字字符串
    为参数类型一样返回类型不同的接口写一个泛型方法
    报错:System.NotSupportedException: LINQ to Entities does not recognize the method
    关于泛型类和扩展方法的一点思考
    在ASP.NET MVC下通过短信验证码注册
    ASP.NET MVC下实现前端视图页的Session
  • 原文地址:https://www.cnblogs.com/lvye001/p/10214830.html
Copyright © 2011-2022 走看看