Skip to main content
 首页 » 编程设计

python之不同用户类型的django模型设计

2024年11月24日24cmt

我刚刚开始学习 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  

请您参考如下方法:

您的实现就快完成了。看起来你不需要 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 内置权限系统的一般文档。例如,您的公司和招聘人员模型可以为 has_perm('your_app.add_job') 返回 True,而您的 Jobseeker 模型返回 False。 IE。公司和招聘人员可以创造就业机会,但求职者不能。

希望这对您有所帮助!