我的序列化程序中有一个字段,它是以另一个字段的值为条件所必需的。例如仅当CCD_ 2是CCD_ 3时才需要CCD_。
我有这个序列化程序
class UserSerializer(ModelSerializer):
...
password = CharField(write_only=True, required=False)
def validate(self, data):
if 'email' in data.keys() and 'password' not in data.keys():
raise ValidationError({'password', 'this field is required'})
return data
这种方法有效,但得到的回应是:
{
"non_field_errors": [
"{'this filed is required', 'password'}"
]
}
当我删除write_only时,我得到
{
"password":["this filed is required"]
}
这就是我想要的write_only
版本:
djangorestframework==3.8.2
django==2.2.12
只需在验证方法中使用raise serializers.ValidationError({'password': "this field is required"})
而不是raise ValidationError({'password': "this field is required"})
。检查对象级验证
from rest_framework import serializers
...
def validate(self, attrs):
if 'email' in attrs.keys() and 'password' not in attrs.keys():
raise serializers.ValidationError({'password': "this field is required"})
return attrs
以上只是您案例中的一个快速解决方案,但DRF也提供了单字段级别的验证方法。
注意:根据DRF:使用此验证错误
建议使用ValidationError
的样式是保持名称空间在serializers
下,为了尽量减少与Django内置CCD_ 9。例如:
from rest_framework import serializers
raise serializers.ValidationError('Value was invalid')
现场级验证
您也可以编写password
0方法,在该方法中,如果序列化程序字段中有(required=True)
,则可以使用与特定字段有关的所有验证来引发ValidationError("field is required")
。
可以使用此语句从中检索字段级验证请求数据。
request_data = self.context['view'].request.data