【问题标题】:Django Rest Framework - Give Serializer of default User model validations that mimic the default validationsDjango Rest Framework - 为模拟默认验证的默认用户模型验证提供序列化器
【发布时间】:2018-06-09 05:23:33
【问题描述】:

我目前正在制作人们可以通过它注册自己的 REST API。而且我正要编写验证密码应该多长/复杂等。当我想到可能有一种方法可以模仿模型已经设置的默认约束?有吗?

我的 serializer.py 代码如下所示:

from rest_framework import serializers
from django.contrib.auth import get_user_model
from rest_framework.reverse import reverse

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    links = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'password', 'groups', 'user_permissions', 'is_staff', 'is_active', 'is_superuser', 'last_login', 'date_joined', 'links')

    def get_links(self, obj):
        request = self.context['request']
        username = obj.get_username()
        return{
            'self': reverse('user-detail', kwargs={User.USERNAME_FIELD: username}, request=request)
        }

    def validate(self, attrs):
        #...

谢谢

【问题讨论】:

    标签: python django rest validation frameworks


    【解决方案1】:

    您可以使用 AUTH_PASSWORD_VALIDATORS 设置启用 Django 密码验证。 但是

    验证器不适用于模型级别,例如在 User.objects.create_user() 和 create_superuser() 中。

    所以你需要给序列化器添加验证:

    from django.contrib.auth.password_validation import validate_password
    
    def validate_password(self, value):
        user = self.context['request'].user
        validate_password(password=value, user=user)
    

    【讨论】:

    • 是否可以为其他字段添加额外的验证器?还是创建一个模型表单来填充数据并让它引发验证错误可能更有效?
    • 如果您正在谈论它,这不会禁用所有其他模型级别的验证。如果您需要额外的验证,您可以覆盖 validate 方法或在序列化程序中实现 validate_field_name 方法。
    • 哦,对了,我明白了,我想复制模型方法 .is_valid() 对数据所做的验证。但是嗯...
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2020-05-23
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多