Аутентификация в Django Rest Framework с помощью пользовательской модели пользователя
В моем приложении django есть несколько типов пользователей: Сотрудник и Пациент. У них есть поля, которые специфичны для каждого из них. Они реализованы с помощью модели AbstractBaseUser, как показано ниже:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
class User(AbstractBaseUser):
username = models.CharField(max_length=40, unique=True)
USERNAME_FIELD = 'identifier'
first_name = models.CharField(
max_length=50, null=False, blank=False)
last_name = models.CharField(
max_length=50, null=False, blank=False)
date_of_birth = models.DateField(null=False, blank=False)
USER_TYPE_CHOICES = (
(1, 'Patient'),
(2, 'Employee'),
)
user_type = models.PositiveSmallIntegerField(
choices=USER_TYPE_CHOICES, default=1, blank=False, null=False)
class Role(models.Model):
RoleName = models.CharField(max_length=50, null=False, blank=False)
class Employee(models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, primary_key=True)
employment_start_date = models.DateField(null=False, blank=True)
employment_end_date = models.DateField(null=False, blank=True)
role = models.ForeignKey(
Role, on_delete=models.CASCADE, related_name='assigned_employees')
class Patient(models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, primary_key=True)
У меня есть несколько вопросов о том, как действовать дальше:
- Как только выбор в классе User ограничивает поля, к которым пользователь имеет доступ? Если бы у меня была HTML-страница, я бы создал сотрудника, затем создал бы пользователя, или наоборот? Когда я использую Django Rest Framework, как я могу реализовать регистрацию и вход в систему с двумя различными типами?
Я пытаюсь понять, как это будет работать концептуально. Является ли модель Employee и Patient подклассом User? Или это отдельные модели? Любая помощь или совет будут очень признательны
В вашем коде нет двух типов User
. У вас есть только один тип - class User(AbstractBaseUser)
. Employee
и Patient
- это обычные модели, которые связаны только с User
.
Если вы хотите создать два типа User
с фактическим наследованием, то вы должны сделать следующее:
class AbstractUser(AbstractBaseUser):
class Meta:
abstract = True
# main user fields here
class Employee(AbstractUser):
# employee fields here
class Patient(AbstractUser):
# patient fields here
Если вы не хотите этого делать, ваш текущий подход хорош. Вы можете просто аутентифицировать User
стандартным способом. При создании вы можете сделать отдельные формы для регистрации сотрудника User
, что создаст автоматически связанный класс Employee
. Аналогично для Patient
. Они будут разделять только поля класса User
при любом подходе.
Для аутентификации различными способами вы можете использовать пользовательскую аутентификацию с помощью функции authenticate()
. Читайте подробности в Django Docs