Дизайн модели django с разными типами пользователей

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

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

Каким будет дизайн модели для такого варианта использования? Меня смущают несколько типов пользователей в 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 

person Surya Adhikari    schedule 09.06.2019    source источник
comment
Это отличный вопрос, но он также очень широкий (не то чтобы это плохо, просто ответ будет довольно длинным). Вот две ссылки, которые выглядят полезными и могут помочь сузить проблему: заголовок stackoverflow.com/questions/25841712/, simpleisbetterthancomplex.com/tutorial/2018/01/18/   -  person Tomasz Zieliński    schedule 09.06.2019
comment
Большое спасибо, что показали мне путь. Я хотел бы проверить, правильно ли я понял или нет. Не могли бы вы проверить обновленный раздел для описания моих вариантов использования, пожалуйста?   -  person Surya Adhikari    schedule 09.06.2019
comment
Похоже, вы на правильном пути. Ответы @rydber тоже хороши. Одна незначительная вещь, которую я бы изменил, - это заменить логические поля функциями/свойствами, проверяющими, присутствует ли связанный объект, например: def is_job_seeker(self): try: user.jobseeker; except JobSeeker.DoesNotExist: return False; else: return True. Таким образом улучшается согласованность, так как есть единственный источник правды (но производительность ниже, так как есть поиск в БД; это можно смягчить, используя кешированное свойство, которое является его собственным червем :)). Но это просто нит.   -  person Tomasz Zieliński    schedule 10.06.2019


Ответы (1)


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

У меня было бы что-то вроде:

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'), а ваша модель «Искатель работы» возвращает False. т.е. Компании и рекрутеры могут создавать рабочие места, а соискатели — нет.

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

person ahmedaljawahiry    schedule 09.06.2019