Django Rest Framework验证器不在extra_kwargs内执行

时间:2017-06-28 11:24:10

标签: django django-rest-framework

我从默认的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" ] } ]} 来解决此问题?

1 个答案:

答案 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

所以你的第一个解决方案是唯一合适的解决方案:)