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

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定义添加字段或其他内容时使用?

Ant*_*ash 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

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