drf框架中的ListModelSerializer序列化组件

03-03 ListModelSerializer组件

由于ModelSerializer类默认不提供群改的update功能,为了实现群改功能,需要我们在Meta中设置list_serializer_class,具体步骤如下:

  1. 自定义ListModelSerializer子类,将子类绑定给list_serializer_class。
  2. 重写update方法通过参数instance(要更新的对象们)及参数validated_data(要更新的数据们)得到更新后的对象们instance并返回

代码如下:

# serializers.py
from rest_framwork import serializers

class ListSerializer(serializers.ListSerializer):
    # 1.create方法父级ListSerializer已经提供了
    
    # 2.父级ListSerializer没有通过update方法的实现体,需要自己重写
    def update(self, instance, validated_data):
        """
        instance: 要更新的对象们
        validated_data: 更新的数据们
        通过self.child可以访问绑定的ModelSerializer
        """
        return [
            self.child.update(instance[i], attrs) for i, attrs in enumerate(validated_data)
        ]
   
class MyModelSerializer(serializers.ModelSerializer):
    # 通过MyModelSerializer.Meta.list_serializer.class来访问绑定的Listserializer
    class Meta:
        # 关联ListSerializer
        list_serializer_class = ListSerializer
        ...

加餐:子序列化

如果有只查接口,我们可以用子序列化的方式来自定义深度

如下:

# utils.serializers.py
from rest_framework import serializers

class MyModelSerializer(serializers.ModelSerializer):
    # 子序列化都是提供给外键(正向方向)完成深度查询的,外键数据是唯一:many=Fasle;不唯一:many=True
    # 注意:只能参与序列化,且反序列化不能写(反序列化外键字段会抛异常)
    
    # 子序列化:实例化一个序列化类对象
    books = BookModelSeriazlier(many=True)
    class Meta:
        model = models.Publish
        fields = ['name', 'address', 'books']
posted @ 2019-11-25 19:15  17vv  阅读(637)  评论(0编辑  收藏  举报