Python 覆盖rest身份验证注册表序列化程序,添加年龄验证

Python 覆盖rest身份验证注册表序列化程序,添加年龄验证,python,django,django-rest-framework,django-allauth,django-rest-auth,Python,Django,Django Rest Framework,Django Allauth,Django Rest Auth,我试图在rest auth创建过程中验证用户的年龄。我设法在注册期间添加字段并保存它,但现在我很难验证年龄是否小于18岁。 有人能告诉我该怎么做吗? 我曾尝试通过我的AbstractUser模型,使用@property方法进行验证,它在注册期间引发了验证错误,但用户帐户仍在保存,由于验证错误,我无法访问用户详细信息视图,所以我得出的结论是,我更愿意通过验证来阻止注册,但这在我的案例中不起作用 class RegisterSerializer(serializers.Serializer):

我试图在rest auth创建过程中验证用户的年龄。我设法在注册期间添加字段并保存它,但现在我很难验证年龄是否小于18岁。 有人能告诉我该怎么做吗? 我曾尝试通过我的
AbstractUser
模型,使用
@property
方法进行验证,它在注册期间引发了
验证错误
,但用户帐户仍在保存,由于
验证错误
,我无法访问用户详细信息视图,所以我得出的结论是,我更愿意通过验证来阻止注册,但这在我的案例中不起作用

class RegisterSerializer(serializers.Serializer):
    username = serializers.CharField(
        max_length=get_username_max_length(),
        min_length=allauth_settings.USERNAME_MIN_LENGTH,
        required=allauth_settings.USERNAME_REQUIRED
    )
    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
    date_of_birthday = serializers.DateField() ### ADDED BY ME
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)

    def validate_username(self, username):
        username = get_adapter().clean_username(username)
        return username

    def validate_email(self, email):
        email = get_adapter().clean_email(email)
        if allauth_settings.UNIQUE_EMAIL:
            if email and email_address_exists(email):
                raise serializers.ValidationError(
                    _("A user is already registered with this e-mail address."))
        return email

    def validate_age(self, date_of_birthday): ### ADDED BY ME
        age = relativedelta(datetime.now(), date_of_birthday).years

        if age < 18:
            raise serializers.ValidationError('Must be at least 18 years old to register.')
        else:
            return age

    def validate_password1(self, password):
        return get_adapter().clean_password(password)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError(_("The two password fields didn't match."))
        return data

    def custom_signup(self, request, user):
        pass

    def get_cleaned_data(self):
        return {
            'username': self.validated_data.get('username', ''),
            'date_of_birthday': self.validated_data.get('date_of_birthday', ''), ### ADDED BY ME
            'password1': self.validated_data.get('password1', ''),
            'email': self.validated_data.get('email', '')
        }

    def save(self, request):
        adapter = get_adapter()
        user = adapter.new_user(request)
        self.cleaned_data = self.get_cleaned_data()
        adapter.save_user(request, user, self)
        self.custom_signup(request, user)
        setup_user_email(request, user, [])
        user.date_of_birth = self.cleaned_data.get('date_of_birthday') ### ADDED BY ME
        user.save() ### ADDED BY ME
        return user
class RegisterSerializer(serializers.Serializer):
username=serializers.CharField(
最大长度=获取用户名最大长度(),
min_length=allauth_settings.USERNAME_min_length,
必需=allauth\u设置。用户名\u必需
)
email=serializers.EmailField(必需的=allauth\u设置。必需的email\u)
date_of_Birth=序列化程序。DateField()####由我添加
password1=serializers.CharField(write_only=True)
password2=serializers.CharField(write_only=True)
def验证_用户名(self,username):
用户名=获取适配器()。清除用户名(用户名)
返回用户名
def验证_电子邮件(自我,电子邮件):
电子邮件=获取适配器()。清除电子邮件(电子邮件)
如果allauth_settings.UNIQUE_电子邮件:
如果存在电子邮件和电子邮件地址(电子邮件):
引发序列化程序。验证错误(
_(“用户已使用此电子邮件地址注册。”)
返回电子邮件
def validate#U age(自我、生日):##由我添加
年龄=relativedelta(datetime.now(),生日的日期)。年
如果年龄<18岁:
raise serializers.ValidationError('必须至少18岁才能注册')
其他:
回归年龄
def validate_密码1(自身、密码):
返回get_adapter()。清除密码(password)
def验证(自身、数据):
如果数据['password1']!=数据['password2']:
raise serializers.ValidationError(389;(“两个密码字段不匹配”))
返回数据
def自定义注册(自我、请求、用户):
通过
def get_cleaned_数据(自):
返回{
“用户名”:自我验证的_数据.get('username',''),
“生日日期”:我添加的self.validated_data.get('date_of_birth','')。#
“password1”:self.validated_data.get('password1',''),
'email':自我验证的_数据.get('email','')
}
def保存(自我、请求):
适配器=获取适配器()
用户=适配器。新用户(请求)
self.cleaned_data=self.get_cleaned_data()
适配器。保存用户(请求、用户、自身)
自定义注册(请求、用户)
设置\用户\电子邮件(请求、用户,[])
user.date_of_birth=self.cleaned_data.get('date_of_birth')##由我添加
user.save()###由我添加
返回用户

您可以通过定义在字段名前加前缀
validate\uu
的方法来验证序列化程序字段。在您的情况下,将
validate_age
替换为
validate_date_of_birth

def validate_date_of_birthday(self, date_of_birthday):
    age = relativedelta(datetime.now(), date_of_birthday).years

    if age < 18:
        raise serializers.ValidationError('Must be at least 18 years old to register.')
    else:
        return date_of_birthday
def验证生日日期(自我、生日日期):
年龄=relativedelta(datetime.now(),生日的日期)。年
如果年龄<18岁:
raise serializers.ValidationError('必须至少18岁才能注册')
其他:
生日的返回日期