使用django-rest-auth注册多种用户类型

3
我正在学习Django Rest框架,有一个涉及多个用户类型的项目。例如,项目包括学生、教师和管理员,每种用户类型都有其各自的属性。因此,我创建了一个继承自AbstractUser的User模型,以及针对每种用户类型的三个其他模型,其中每种类型都有其相应用户的外键。现在问题来了,如何在这些用户类型中使用Django-Rest-Auth库?例如,当我使用注册端点时,如何修改它以便根据请求数据在students模型中创建一个学生?感谢任何人的帮助。

2
一个旁注:django-rest-auth自2019年9月以来就没有维护了(他们说“暂停”)。 - Vincenzo Lavorini
你知道我可以在DjangoRest中使用的其他身份验证包吗?@VincenzoLavorini - Omar Emad
1
我正在尝试使用Djoser - Vincenzo Lavorini
1个回答

3

我会选择类似于这样的REST实现。所以在我的模型中,



class CustomUser(AbstractUser):

    CHOICES = (
        ('T', 'Teacher'),
        ('A', 'Administration'),
        ('S', 'Student'),
    )
    role = models.CharField(max_length=1, choices=CHOICES)

class Teacher(models.Model):
     user = models.OneToOneField(
        CustomUser, on_delete=models.CASCADE, related_name="teacher_account"
    )
...

class Student(models.Model):
...

一旦您的模型完成并更新了设置以使用自定义AUTH_USER_MODEL,请创建自定义注册序列化器。

from rest_framework import serializers

from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email

from rest_auth.registration.serializers import RegisterSerializer


class MyCustomRegistrationSerializer(RegisterSerializer):
    CHOICES = (
        ('T', 'Teacher'),
        ('A', 'Administration'),
        ('S', 'Student'),
    )
    role = serializers.ChoiceField(max_length=1, choices=CHOICES)

    def get_cleaned_data(self):
        data_dict = super().get_cleaned_data()
        data_dict['role'] = self.validated_data.get('role', '')
        return data_dict

注意区别:serializers.ChoiceField。让 Django 在注册期间使用它。在你的settings.py中设置如下:

# note the path, use the location of your current serializers
REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'api.serializers.MyCustomRegistrationSerializer',
}

现在,您的本地路径用于注册用户应该显示一个额外的选择字段,以便每当新用户注册时,他们可以指定他们有什么角色。

为了在注册期间将此信息保存到数据库中,需要创建一个适配器。在您的项目应用程序中创建app3/adapter.py:

from allauth.account.adapter import DefaultAccountAdapter


class CustomAccountAdapter(DefaultAccountAdapter):

    def save_user(self, request, user, form, commit=False):
        user = super().save_user(request, user, form, commit)
        data = form.cleaned_data
        user.preferred_locale = data.get('role')
        user.save()
        return user

同样,在您的设置中注册此适配器。
ACCOUNT_ADAPTER = 'app3.adapter.CustomAccountAdapter'

这应该有效。尚未针对您的特定用例进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接