----------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',否则会报错。