ModelSerializer
重写DRF的to_representation和to_internal_value方法有什么用途?
- to_representation() 允许我们改变序列化的输出。
- to_internal_value() 允许改变我们反序列化的输出。
def to_representation(self, value):
# 调用父类获取当前序列化数据,value代表每个对象实例obj
data = super().to_representation(value)
# 对序列化数据做修改,添加新的数据
data['total_likes'] = value.liked_by.count()
return data
向序列化器传递内容-上下文
view.py
# context 的内容会放在上下文管理器中
serializer = serializer_class(page, many=True, context={"request": request})
serializers.py
class xxxSerializer(serializers.ModelSerializer):
join_status = serializers.SerializerMethodField()
def get_join_status(self, obj):
request = self.context["request"]
pass
class Meta:
...
解除多对多必填限制
...
class BaseSerializer(serializers.ModelSerializer):
project_apply = serializers.ListField(
child=serializers.PrimaryKeyRelatedField(queryset=field_model.Project.objects.all()), required=False, write_only=True)
class Meta:
fields = '__all__'
extra_kwargs
- 指定某个字段为只写
class Meta:
model = models.CvtBondsPool
exclude = ("created_time", "updated_time")
extra_kwargs = {
"maintain_report_classes": {"write_only": True}
}
serializers.ListField
- 指定该字段 为列表类型,里面的值为Int类型,且只在写入时校验
class CvtBondsPoolSerializer(serializers.ModelSerializer):
cvt_rating_choices = serializers.ListField(child=serializers.IntegerField(), write_only=True)
PrimaryKeyRelatedField
使用 PrimaryKeyRelatedField 将返回一个对应关系 model 的主键。
参数:
- queryset 用于在验证字段输入时模型实例查找。 关系必须明确设置 queryset,或设置 read_only = True
- many 如果是对应多个的关系,就设置为 True
- allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False
- pk_field 设置为一个字段以控制主键值的序列化/反序列化。例如,pk_field = UUIDField(format ='hex') 将UUID主键序列化为紧凑的十六进制表示。
序列化模型如下
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
序列化结果如下:
{
'album_name': 'Undun',
'artist': 'The Roots',
'tracks': [
89,
90,
91,
...
]
}