django: rest-framework序列化对象及关联对象(实现多级分类的序列化例子)

  1. 在项目中经常会遇到多级分类的状态, model中,常常用只用一个model类来表示多级分类, 那么使用restframework序列化的时候如何让类别的层级更有条理呢?
  • 1.在模块中是常规写法:

此处商品类别的分类级别是固定的, 不会无限级分类的的情况, 这样会简单的多。
models.py的常规写法:

class GoodsCategory(models.Model):
    """ 
    商品类别
    """
    CATEGORY_TYPE = ( 
        (1, "一级类目"),
        (2, "二级类目"),
        (3, "三级类目"),
    )   
    name = models.CharField(default="", max_length=30, 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")

注意此处的related_name定义为sub_cat, 待会会用的到。

  • 2.在视图方法中同样使用的常规的写法:

在视图中指定一个需要序列化的查询集和一个序列化类:

class CategoryViewSet(mixins.ListModelMixin,  viewsets.GenericViewSet):
    queryset = GoodsCategory.objects.all()
    serializer_class = CategorySerializer
  • 3.关键之处在于序列化类的书写
class CategorySerializer(serializers.ModelSerializer):
    # sub_cat是model中已经指定的related_name, 需要保持一致
    # 以下sub_cat和parent_category均可以体现分类的层级关系, 
    # sub_cat表示子类, parent_category表示父类
    sub_cat = CategorySerializer2(many=True)
    # parent_category = CategorySerializer2()    
    class Meta:
        model = GoodsCategory
        fields = '__all__'

可以看出, 序列化类CategorySerializer中又对sub_cat字段作序列化。
当然还需要再写两个序列化类。

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__'
  • 未完

Leave a Reply

Your email address will not be published.