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,
        ...
    ]
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号