Django层级模型定义及序列化嵌套的方法

----------Django==2.0.2-----------

 

一、Django层级模型的定义

实例:(商品模型)

 

class GoodsCategory(models.Model):
    """
    商品分类
    """
    CATEGORY_TYPE = (
        (1, "一级类目"),
        (2, "二级类目"),
        (3, "三级类目"),
    )

    name = models.CharField('类别名',default="", max_length=30,help_text="类别名")
    code = models.CharField("类别code",default="", max_length=30,help_text="类别code")
    desc = models.TextField("类别描述",default="",help_text="类别描述")
    #目录树级别
    category_type = models.IntegerField("类目级别",choices=CATEGORY_TYPE,help_text="类目级别")
    # 设置models有一个指向自己的外键
    parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="父类目级别", help_text="父目录",related_name="sub_cat")
    is_tab = models.BooleanField("是否导航",default=False,help_text="是否导航")
    add_time = models.DateTimeField("添加时间",default=datetime.now)

    class Meta:
        verbose_name = "商品类别"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

注意

1、外键关联自己,关联模型必须是self,不能是模型名,否侧会报错

   如:parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="父类目级别", help_text="父目录",related_name="sub_cat")

2、指定 related_name = ''  ,用于关联对象反向引用模型的名称(如序列化嵌套要用到)

二、Django序列化嵌套操作

class CategorySerializer3(serializers.ModelSerializer):
    '''三级分类'''
    class Meta:
        model = GoodsCategory
        fields = ['name','code','desc','category_type','parent_category','is_tab','add_time']
#
class CategorySerializer2(serializers.ModelSerializer):
    '''二级分类'''
    sub_cat = CategorySerializer3(many=True)
    class Meta:
        model = GoodsCategory
        fields = ['name','code','desc','category_type','parent_category','is_tab','add_time','sub_cat']

class CategorySerializer(serializers.ModelSerializer):
    '''商品一级分类'''
    sub_cat= CategorySerializer2(many=True)
    class Meta:
        model = GoodsCategory
        fields = ['name','code','desc','category_type','parent_category','is_tab','add_time','sub_cat']

注意:

1、序列化模型中最后一个分类要放在最前面定义

2、注意嵌套的时候一定要指定之前related_name里面的值,如: 'parent_category'  中的  related_name的值  ‘sub_cat’

3、另外除了最内层的字段不需要指定sub_cat字段,其他的序列化模型中必须指定sub_cat字段,另外fields中必须包含'sub_cat',否则会报错。

 

posted @ 2018-06-28 11:07  莫问丶过往  阅读(3419)  评论(0编辑  收藏  举报