drf框架中的ListModelSerializer序列化组件
03-03 ListModelSerializer组件
由于ModelSerializer类默认不提供群改的update功能,为了实现群改功能,需要我们在Meta中设置list_serializer_class,具体步骤如下:
- 自定义ListModelSerializer子类,将子类绑定给list_serializer_class。
- 重写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']