Django модель дизайна с различными типами пользователей - PullRequest
2 голосов
/ 09 июня 2019

Я только изучаю Django, поэтому я подумал о создании проекта под названием Job Board, чтобы понять его более подробно.Я нарисовал следующий вариант использования.

  • Люди могут регистрироваться как ищущие работу, создавать свои профили и искать вакансии, соответствующие их навыкам
  • Компании могут регистрироваться, размещать вакансии.
  • Несколько представителей от компаниидолжен иметь возможность регистрироваться и размещать вакансии.
  • Независимый рекрутер также может создать учетную запись.
  • Компания может связаться с этим независимым рекрутером.

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

Пока я мог сделать только следующее:

class User(AbstractUser):
    '''
      Abstract user because django recommends to start with custom user
    '''
    username = None
    email = models.EmailField(_("Email Address"), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email


class Company(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

Я мог бы создать модель для Пользователя и Компании.Но я понятия не имею, как обращаться с несколькими типами пользователей, так как пользователь может быть либо соискателем, либо рекрутером.Кроме того, несколько представителей компании должны иметь возможность регистрироваться и размещать вакансии, а также может быть независимый рекрутер.Как бы вы справились с таким случаем, если бы пришлось?Может кто-нибудь помочь мне в пошаговом руководстве, пожалуйста?Таким образом, это очистит мою путаницу и поможет мне в будущем улучшить дизайн таблиц.

Обновление с примером в двух словах

class User(models.Model):
    '''
        User can be of any 3 types or can have multiple role as well
    '''
    is_job_seeker = models.BooleanField(default=False)
    is_recruiter = models.BooleanField(default=False)
    is_mentor = models.BooleanField(default=False)

class Company(models.Model):
    user = models.ForeignKey(User) # only user with is_recruiter flag active can be

class JobSeeker(models.Model):
    user = models.OneToOneField(User)
    # job seeker profile related fields like experiences, skills, education, profile image etc

class Recruiter(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company = models.ForeignKey(Company, null=True, blank=True)
    # recruiter related profile 

1 Ответ

1 голос
/ 09 июня 2019

Ваша реализация почти на месте. Не похоже, что вам нужна пользовательская модель прямо сейчас, поэтому я бы просто использовал Django default .

Я бы хотел что-то вроде:

from django.conf import settings
from django.db import models

class Company(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    # Other company-related fields

class JobSeeker(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    # Other jobseeker-related fields

class Recruiter(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    company = models.ForeignKey(Company, null=True, blank=True)
    # Other recruiter-related fields

Когда вы создаете любую из моделей выше, вы можете назначить им учетную запись пользователя; а для рекрутера вы можете назначить компанию, в которой они работают. Например, компания с именем stack_overflow может иметь собственную учетную запись компании с именем пользователя / паролем / и т. Д. Затем рекрутеры, работающие на stack_overflow, могут также иметь свои собственные учетные записи со своим собственным именем пользователя / паролем / и т.д. Выполнение такой команды, как stackoverflow.recruiter_set, даст вам всех рекрутеров, которые работают в stack_overflow.

Обратите внимание, что я не ссылаюсь User напрямую . Использование вышеуказанного подхода облегчит вашу жизнь, если вы решите поменять пользовательские модели в будущем.

Я предполагаю, что вы не хотите создавать User, а затем создать Company и связать его с этим пользователем - вы просто хотите сделать это за один раз. Это немного другой вопрос, и решение будет заключаться в том, чтобы вы создали регистрационную форму или что-то в этом роде, где вы можете добавить некоторую логику о том, является ли пользователь компанией, рекрутером или соискателем.

Что касается других ваших точек зрения, похоже, вы хотите установить права пользователя. Здесь - это документы для установки разрешений по умолчанию для ваших пользовательских пользователей, а здесь - это общие документы для встроенной системы разрешений Django. Например, модель вашей компании и рекрутера может вернуть True для has_perm('your_app.add_job'), в то время как ваша модель Jobseeker вернет False. То есть Компании и рекрутеры могут создавать рабочие места, но соискатели не могут.

Надеюсь, это поможет!

...