具有不同用户类型的Django模型设计

时间:2019-06-09 12:53:55

标签: python django django-models

我只是在学习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 个答案:

答案 0 :(得分:1)

您的实现即将完成。看来您现在不需要custom user model,所以我只用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的公司可以拥有自己的公司帐户,并带有用户名/密码/ etc。然后,为stack_overflow工作的招聘人员也可以拥有自己的帐户,并带有自己的用户名/密码/ etc。运行stackoverflow.recruiter_set之类的命令将为您提供所有为stack_overflow工作的招聘人员。

请注意,我do not reference User directly。如果您决定将来切换用户模型,使用上述方法可以使您的生活更轻松。

我假设您不想创建User,然后创建Company并将其链接到该用户-您只想一次完成。这是一个稍有不同的问题,解决方案将涉及您创建注册Form或类似的东西,您可以在其中添加一些有关用户是公司,招聘人员还是求职者的逻辑。

关于您的其他观点,您似乎希望设置用户权限。 Here是为自定义用户设置默认权限的文档,而here是Django内置权限系统的常规文档。例如,您的Company and Recruiter模型可以为True返回has_perm('your_app.add_job'),而Jobseeker模型可以返回False。即公司和招聘人员可以创建工作,但求职者却不能。

希望这会有所帮助!