首页 > 解决方案 > 在 django rest 框架中有条件地要求 write_only 字段

问题描述

我的序列化程序中有一个字段,它需要以另一个字段的值为条件。password仅当registerFieldis时才需要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

标签: pythondjangodjango-rest-framework

解决方案


只需在验证方法中使用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

推荐阅读