Django Модель пользователя (сотрудник и клиент)

В настоящее время я работаю над системой доставки мобильных приложений, которая предполагает два типа пользователей: "Сотрудник" и "Клиент". Каждый тип пользователей будет иметь различные представления и разрешения в приложении. Кроме того, каждый тип пользователей будет иметь свой собственный "профиль", если хотите. Профиль сотрудника в основном предназначен только для обозначения ролей компании. Профиль клиента в основном используется для сохранения адреса для доставки.

Я пытаюсь узнать мнения о том, что лучше всего использовать для достижения чего-то подобного. Я не могу решить, что лучше использовать - AbstractBaseUser или AbstractUser.

Ниже показаны модели, которые я хочу создать, а также их взаимоотношения: visual for User models

Ниже приведен файл user/models.py, который я смоделировал:

class UserTypes(models.Model):
    type = models.CharField(max_length=100)

    def __str__(self):
        return self.type


class User(AbstractBaseUser):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField()
    phone_number = models.CharField(max_length=20)
    is_employee = models.BooleanField(default=False)
    is_customer = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'


# if user.is_employee == True
class EmployeeProfile(models.Model):
    EMPLOYEE_ROLES = (
        ('Driver', 'driver'),
        ('Production', 'production'),
        ('Manager', 'manager')
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    role = models.CharField(max_length=12, choices=EMPLOYEE_ROLES)

    def __str__(self):
        return self.user


# if user.is_customer == True
class CustomerProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company = models.CharField(max_length=100)
    address = models.CharField(max_length=100)
    address_2 = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=2, help_text="State Abbreviation (ex: OH)")
    zipcode = models.CharField(max_length=5)

    def __str__(self):
        return self.user

Я знаю, что мне также нужно использовать сигналы Django или что-то подобное для создания профиля пользователя (для сотрудника или клиента, при создании пользователя).

Заранее спасибо!

Ваш код работает Но согласно стандартам паттерна проектирования, можно сказать, что в пользователя с именем is_employee нужно поместить поле Boolianfield, а вся информация обоих типов пользователей должна быть в AbstractUser, но со значениями null=True и blank=True. Таким образом, у вас будет один пользователь, которого можно разделить полем is_employee. Надеюсь, это было полезно

Вернуться на верх