使django-rest框架中有条件地需要一个write_only字段



我的序列化程序中有一个字段,它是以另一个字段的值为条件所必需的。例如仅当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')

现场级验证

您也可以编写password0方法,在该方法中,如果序列化程序字段中有(required=True),则可以使用与特定字段有关的所有验证来引发ValidationError("field is required")

可以使用此语句从中检索字段级验证请求数据。

request_data = self.context['view'].request.data

最新更新