ModelSerializer

重写DRF的to_representation和to_internal_value方法有什么用途?

  1. to_representation() 允许我们改变序列化的输出。
  2. 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,
        ...
    ]
}

https://zhuanlan.zhihu.com/p/27667372

posted @ 2021-08-10 16:12  Tank-Li  阅读(74)  评论(0编辑  收藏  举报