Serializers

serializer只需要定义好字段即可(序列化器的字段名称和对应的对象的字段想对应),任何方法都是非必须的。

序列化

s = XXSerializer(instance)
s.data  --> 获得的是python的原生数据类型
可以通过  JSONRenderer来获得JSON格式的数据

逆序列化

data = JSONRenderer.parse(stream)
serializer = XXSerializer(data=data)
serializer.is_valid()
serializer.validated_data

可以通过定义create update来实现实例的保存

def create(self, instance, validated_data):
    return XX(**validated_data)

def update(self, instance, validated_data):
    return instance

在获得serializer之后,通过调用save来保存,校验一些参数,根据构造时是否传入了instance来分别调用create或update
serializer.save()还可接受参数,这些参数会传递到validated_data中,这样在create和update中可以使用
此外,还可以直接重载save函数,

验证

需要先调用is_valid才能获得serializer的validated_data或调用save。如果在逆序时验证失败则可查看其errors属性。

serializer.error
# dict 其中的每个key值是字段名称,值为错误原因(list)
# 另有non_filed_error指明通用错误,可以通过NON_FIELD_ERRORS_KEY来设置该键值的名称
# 如果是list的错误返回的是list的dict

另对于is_valid方法,可以接受raise_exception参数来指示是否抛出异常。

field-level validation

对应字段的validate函数,需要返回接受的参数(可以为处理后的值 不需要为原值)或者触发异常

title = serializer.CharField()
def validate_title(self, value):
    if not:
        raise serializers.ValidationError("err msg")
    return value

object-level validation

需要同时获取多个字段的校验

def validate(self, data):
    # data就是接受的参数字典
    return data

validators

可以抽象出检查函数,在声明字段时包含即可

score = IntegerField(validators=[Uni])

也可以在类的Meta中包含validatiors,这样每个字段都会进行校验

class EventSerial.....

    class Meta:
        validators = Uni....

获取初始值

当传入的是对象,想要序列化时,可以获取instance,即初始值。
当传入的是数据,想要逆序列化,可以获取Initial_data,即初始值。

部分更新

需要在创建序列化器时额外传入partial=True

nested serializer

serializer本身也是field的子类 也可加required=False和many=True参数
在写create函数时需要先构造包含的serializer,再构造自身

related instance

multiple objects

支持序列化 可传入many=True,但是不支持逆序劣化,需要使用ListSerializer

context

s = AccountSerializer(account, context={'request': request})

使用时可通过self.context来获得 但是不会出现在输出中

你可能感兴趣的:(Serializers)