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

问题描述 投票:2回答:1

其实我正在学习Django Rest框架,我有一个项目,涉及到多个用户类型,例如它由学生、教师和管理员组成,每个人都有自己的属性,所以我创建了一个继承自AbstractUser的User模型,并为每个类型创建了另外3个模型,每个类型都有对应用户的外键。那么问题来了,我如何使用Django-Rest-Auth库来处理这些用户类型,例如当我使用注册端点时,我如何修改它,以便根据请求数据在学生模型中创建一个学生?

我将感谢任何的帮助。

先谢谢你

django django-rest-framework django-rest-auth
1个回答
0
投票

我会用这样的东西来做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'

这应该可以。但还没有针对你的特殊使用情况进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.