【问题标题】:django model design with different user types不同用户类型的django模型设计
【发布时间】:2019-06-09 12:53:55
【问题描述】:

我只是在学习 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 

【问题讨论】:

  • 这是一个很好的问题,但也很广泛(不是说它不好,只是答案会很长)。这里有两个看起来很有用的链接,可以帮助“缩小”问题:stackoverflow.com/questions/25841712/…simpleisbetterthancomplex.com/tutorial/2018/01/18/…
  • 非常感谢您向我展示了路径。我想检查我是否正确理解。请您查看更新的部分以涵盖我的用例吗?
  • 看来您的方向是正确的。 @rydber 的回答也很好。我要更改的一件小事是我将用函数/属性替换布尔字段,检查是否存在相关对象,例如:def is_job_seeker(self): try: user.jobseeker; except JobSeeker.DoesNotExist: return False; else: return True。通过这种方式,一致性得到了提高,因为存在单一的事实来源(但由于存在数据库查找,性能会降低;这可以通过使用缓存属性来缓解,该属性是它自己的蠕虫罐 :))。但这只是一点点。

标签: python django django-models


【解决方案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 的公司可以拥有自己的公司帐户,其用户名/密码/等。然后,为 stack_overflow 工作的招聘人员也可以使用自己的用户名/密码/等拥有自己的帐户。运行stackoverflow.recruiter_set 之类的命令将为您提供所有为 stack_overflow 工作的招聘人员。

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

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

关于您的其他观点,您似乎正在寻找设置用户权限。 Here 是为自定义用户设置默认权限的文档,here 是 Django 内置权限系统的通用文档。例如,您的 Company 和 Recruiter 模型可以为 has_perm('your_app.add_job') 返回 True,而您的 Jobseeker 模型返回 False。 IE。公司和招聘人员可以创造就业机会,但求职者不能。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多