我有从默认 Django 用户模块扩展的管理员模块。
在 Django Rest Framework 中,我使用用户名和电子邮件验证器为此模块创建了一个序列化程序。
当我声明验证器内联时一切顺利:
class AdministratorCreateUpdateSerializer(ModelSerializer):
username = serializers.CharField(
source='user.username',
validators=[UniqueValidator(queryset=User.objects.all())]
)
email = serializers.EmailField(
source='user.email',
validators=[UniqueValidator(queryset=User.objects.all())]
)
password = serializers.CharField(
source='user.password',
allow_blank=True,
style={'input_type': 'password'}
)
first_name = serializers.CharField(
source='user.first_name'
)
last_name = serializers.CharField(
source='user.last_name'
)
class Meta:
model = Administrator
fields = [
'username',
'email',
'password',
'first_name',
'last_name',
]
但是当我在
extra_kwargs
中声明它时,验证器不会执行:class AdministratorCreateUpdateSerializer(ModelSerializer):
username = serializers.CharField(
source='user.username',
)
email = serializers.EmailField(
source='user.email',
)
password = serializers.CharField(
source='user.password',
allow_blank=True,
style={'input_type': 'password'}
)
first_name = serializers.CharField(
source='user.first_name'
)
last_name = serializers.CharField(
source='user.last_name'
)
class Meta:
model = Administrator
fields = [
'username',
'email',
'password',
'first_name',
'last_name',
]
extra_kwargs = {
'username': {
'validators': [UniqueValidator(queryset=User.objects.all())]
},
'email': {
'validators': [UniqueValidator(queryset=User.objects.all())]
},
}
这个问题是否来自使用
source
何时定义附加字段或其他内容?
最佳答案
extra_kwargs
不适用于在序列化程序上显式声明的字段。 read_only_fields
的情况相同。 , 然后传递给 extra_kwargs
.当 extra_kwargs
时,显式声明的每个字段都被简单地省略。被添加到其余的构造函数参数中。
这应该在文档中明确指出,但事实并非如此。
讨论:https://github.com/encode/django-rest-framework/issues/3460
代码:https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py#L1007
所以你的第一个解决方案是唯一合适的解决方案:)
关于Django Rest Framework 验证器不在 extra_kwargs 内执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44801069/