ron*_*184 5 django django-rest-framework
我从默认的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',
]
Run Code Online (Sandbox Code Playgroud)
但是当我在里面声明它时,验证器不会执行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())]
},
}
Run Code Online (Sandbox Code Playgroud)
此问题是否来自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
所以你的第一个解决方案是唯一合适的解