python - 在 django rest 框架中有条件地要求 write_only 字段
问题描述
我的序列化程序中有一个字段,它需要以另一个字段的值为条件。password
仅当registerField
is时才需要say email
。
我有这个序列化程序
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 :
推荐的使用风格ValidationError
是将其命名为serializers
,以尽量减少与 Django 内置的ValidationError
. 例如:
from rest_framework import serializers
raise serializers.ValidationError('Value was invalid')
您也可以编写def validate_password(self, data):
方法,如果在序列化器字段中,您可以在其中提出ValidationError("field is required")
有关特定字段的所有验证。(required=True)
在字段级验证请求中,可以使用此语句检索数据。
request_data = self.context['view'].request.data
推荐阅读
- java - How to customize expireAfterWrite for concrete cache if I use cacheBuilder?
- r - R: Compare each element with all the other elements below in a list using foreach, parallel and doParallel
- android - PeriodicWorkRequest not working periodically
- python - Django forms stop form processing on ValidationError
- php - phpMyAdmin Database Not found
- python - 关于重新加载模块的说明
- nginx - Nginx : 允许 Googlebot 并检查其他访问者是否经过身份验证
- button - 如何使用多个按钮?
- visual-studio-code - 我在导入引导程序 5 期间遇到问题
- javascript - 每次再次调用函数时如何更新创建的每个字母?