我从默认的Django用户模块扩展了管理员模块。
在Django Rest Framework中,我使用用户名和电子邮件验证器为该模块创建了一个序列化程序。
当我宣布内联验证器时,一切顺利:
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
在定义添加字段或其他内容时,是否使用{
"users": [
{
"steamid": "[X:X:XXXXXXXXX]",
"teamspeakid": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"nicknames": [
"XXXXXXXXX"
],
"addresses": [
"XX.XX.XXX.XX"
]
},
{
"steamid": "[Y:Y:YYYYYYYYY]",
"teamspeakid": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
"nicknames": [
"YYYYYYYYY"
],
"addresses": [
"YY.YY.YYY.YY"
]
},
{
"steamid": "[Z:Z:ZZZZZZZZZ]",
"teamspeakid": "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ",
"nicknames": [
"ZZZZZZZZZ"
],
"addresses": [
"ZZ.ZZ.ZZZ.ZZ"
]
}
]}
来解决此问题?
答案 0 :(得分:5)
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
所以你的第一个解决方案是唯一合适的解决方案:)