TheSunbathingCrow
TheSunbathingCrow

Reputation: 125

Django Rest Framework authentication with Custom User Model

I have multiple types of user in my django app: Employee and Patient. They have fields that are specific to each of them. They are implemented using the AbstractBaseUser model as below:

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)

I have a few questions with how to go forward with this:

  1. How does just the choice in the User class limit the fields that a user has access to? If I had a HTML page would I create an Employee then a User would be created, or the other way round?
  2. When I'm using Django Rest Framework, how can I implement a sign up and log in with the two different types?

I'm struggling to understand how this would work conceptually. Is like Employee and Patient a subclass of User? Or are they separate models? Any help or advice would be greatly appreciated

Upvotes: 0

Views: 741

Answers (1)

NixonSparrow
NixonSparrow

Reputation: 6388

In your code you don't have two types of User. You have only one type - class User(AbstractBaseUser). Employee and Patient are normal models that are only related to User.

If you wanted to create two types of User with actual inheritence, then you should do following:

class AbstractUser(AbstractBaseUser):
    class Meta:
        abstract = True
    # main user fields here

class Employee(AbstractUser):
    # employee fields here

class Patient(AbstractUser):
    # patient fields here

If you don't want to do this, your current approach is good. You can simply authenticate User in standard way. During creation you can make seperate forms for registering employee User, that creates automatically related Employee class. Similar for Patient. They will share only fields of User class with either approach.

To authenticate in different ways you can use custom authentication with authenticate() function. Read specifics in Django Docs

Upvotes: 1

Related Questions