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)
| 归档时间: |
|
| 查看次数: |
3091 次 |
| 最近记录: |