【问题标题】:How to create Django model field to store users related to the model?如何创建 Django 模型字段来存储与模型相关的用户?
【发布时间】:2017-07-22 07:23:13
【问题描述】:

我正在使用 django 框架在 python 中构建一个 Web 应用程序。在我的应用程序中,用户需要能够申请工作。

我不确定如何将已在工作模型中申请工作的用户列表保存为字段。

这是我的Job.py 模型:

class Job(models.Model):
    user = models.ForeignKey(User, related_name="jobs")
    created_at = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=30)
    description = models.TextField()
    pay = models.FloatField()
    category = models.CharField(max_length=3, choices=JOB_CATEGORY_CHOICES)
    #applicants = 

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('jobs:detail', kwargs={
            'job_pk': self.id
            }
        )

我需要有申请者字段(目前已被注释掉)来存储已申请该工作的用户。我该怎么做?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    假设一个用户可以申请多个职位并且一个职位可以有多个用户申请,简单的解决方案是多对多关系,由ManyToManyField 定义:

    class Job(models.Model):
        users = models.ManyToManyField(User)
    

    现在您可能想要跟踪有关应用程序的其他信息(日期等),在这种情况下,显式中间模型可能会很方便:

    class Application(models.Model):
        job = models.ForeignKey(Job)
        user = models.ForeignKey(User)
        date ⁼ models.DateTimeField(...)
        # etc
    
       class Meta:
           # you probably don't want the same user 
           # to apply twice to the same job
           unique_together = [("job", "user"),]
    

    【讨论】:

    • 我不明白您答案中代码的第一部分是做什么的以及它的目的是什么。你能详细说明一下吗? @bruno desthuilliers
    • 第一个 sn-p 是如何在两个模型之间建立简单(无值)多对多关系的示例。第二个 sn-p 是如何通过中间模型手动创建有价值的多对多关系的示例。实际上,您必须选择其中一个。
    【解决方案2】:

    如果我正确理解您的问题,我认为您需要像这样设置模型:

    class Job(models.Model):
        created_at = models.DateTimeField(auto_now_add=True)
        title = models.CharField(max_length=30)
        description = models.TextField()
        pay = models.FloatField()
        category = models.CharField(max_length=3, choices=JOB_CATEGORY_CHOICES)
    
        def __str__(self):
            return self.title
    
        def get_absolute_url(self):
            return reverse('jobs:detail', kwargs={
                'job_pk': self.id
              }
            )
    
    class Applicant(models.Model):
        job = models.ForeignKey(Job, related_name="applicants")
        user = models.ForeignKey(User)
    

    这将创建从 JobApplicant 的一对多关系,然后创建从 ApplicantUser 的一对多关系。

    【讨论】:

    • 为什么在User 上有一个OneToOne字段?这将阻止用户申请多个工作。
    • 不,在这种情况下,您将创建另一个 Applicant 对象。这意味着每个Applicant 对象只有一个用户。
    • A ForeignKey on User 已经意味着“每个申请人只有一个用户” - 否则你需要一个 ManyToManyField - 虽然 OneToOne 字段确实允许为同一个用户创建多个申请人(对我来说实际上很惊讶,我认为 Django 会阻止这种情况,而 IIRC 它确实阻止了它),它至少会阻止通过 user.applicant_set.all() 从用户那里获取应用程序。 OneToOne 字段主要用于表达“是”关系,而不是“拥有”关系。
    • @themanatuf 为什么不能在包含已申请用户的工作模型中只包含一个名为申请人的字段?我不明白你的解决方案,你能给我解释一下吗?谢谢。
    • 谢谢布鲁诺,我弄错了。我相应地更新了我的答案。
    【解决方案3】:

    正如 themanatuf 所说,其他具有外键和一对一关系的模型可以解决问题。

    不过,我建议您先使用Django 101 polls tutorial - 它得到了很好的解释,并且具有与您希望构建的模型非常相似的相关模型架构。

    玩得开心!

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2012-12-24
      • 2010-12-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多