Django REST框架:在POST上有额外字段时引发错误

gre*_*sov 19 python django rest serialization django-rest-framework

当您编写序列化程序时,指定将包含哪些字段(通过Meta's fields),设置它们的读/写权限并验证它们是微不足道的.但是,我想知道是否有一种简单的方法可以指定包含所包含的字段,并且传入的任何额外密钥都会引发错误.

比如说,我有一个序列化器

class ModelASerializer(serializers.ModelSerializer):

    class Meta:
        model = models.ModelA
        fields = ('name', 'number')
Run Code Online (Sandbox Code Playgroud)

进一步假设我没有任何验证.

我正在使用POST此有效负载来创建一个新实例

{
    "name": "test",
    "number": 5
}
Run Code Online (Sandbox Code Playgroud)

一切都好.

但是假设我的API已经改变,现在我也存储了一个新字段title,但是忘了更新我的序列化程序.客户端将发送看起来像的有效负载

{
    "name": "test",
    "number": 5,
    "title": "Mr"
}
Run Code Online (Sandbox Code Playgroud)

但是,序列化程序将忽略额外的键,而不是引发异常.

所以,我的问题是:有没有办法让序列化程序期望指定的字段fields或 - 如果它不是ModelSerializer- 字段,指定为成员,并且如果不是这样则引发错误?

小智 14

遇到这个问题,发现使用对象级验证更容易一些.这需要简单地定义验证方法:

class ModelASerializer(serializers.ModelSerializer):
    ...
    def validate(self, data):
        if hasattr(self, 'initial_data'):
            unknown_keys = set(self.initial_data.keys()) - set(self.fields.keys())
            if unknown_keys:
                raise ValidationError("Got unknown fields: {}".format(unknown_keys))
        return data
Run Code Online (Sandbox Code Playgroud)