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

标签 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',
        ]

但是当我在 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/

相关文章:

django - 覆盖重新验证密码重置电子邮件问题

python - Django 1.7 - 为定义添加或更改 related_name 参数

python - 如何使用 postman 从 Django Rest Framework 获取 token

DjangoRestFramework - has_permission 错误地覆盖 has_object_permission

Django Oauth 工具包应用程序设置

django - Django 中的复杂反向查询

HTML 未正确连接 CSS

django - 如何在 Django Rest Framework(DRF)中为 ModelSerializers 编写自定义字段验证,类似于 Django 中的表单验证?

python - 如何在 django 的两边设置多对多字段空白=真

使用 Django 销售事件门票的网站中的数据库设计