如何创建Django模型字段来存储与模型相关的用户?

问题描述:

我正在python中使用django框架构建一个web应用程序。在我的应用程序中,用户需要能够申请工作。如何创建Django模型字段来存储与模型相关的用户?

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

这里是我的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 
      } 
     ) 

我需要申请人字段(这是目前注释掉)存储谁已经申请了这份工作的用户。我该怎么做呢?

如果我正确理解你的问题,我想你会需要你的模型设置是这样的:

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

+0

为什么'用户'上的OneToOne字段?这将阻止用户应用于多个工作。 –

+0

不,在这种情况下,您会创建另一个“申请人”对象。它意味着每个“申请人”对象只有一个用户。 – themanatuf

+0

用户上的ForeignKey已经意味着“每个申请人只有一个用户” - 否则你需要一个ManyToManyField--而OneToOne字段的确可以为同一用户创建许多申请人(事实上,对我来说这实在是太惊奇了,我以为Django会防止这种情况,并且IIRC it_did_阻止它),它至少会阻止通过user.applicant_set.all()从用户那里获得应用程序。 OneToOne字段主要是为了表达一种“是”的关系,而不是“有”。 –

正如themanatuf所说,其他具有外键和一对一关系的模型可以做到这一点。

我建议你首先做Django 101 polls tutorial--它很好解释,并且有非常类似的相关模型架构。

玩得开心!

假设一个用户可以应用到很多工作,工作可以有很多的用户应用,简单的解决方案是一个多对多的关系,由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"),] 
+0

我不明白您的答案中的代码的第一部分是什么以及什么其目的是。你能详细说明一下吗? @bruno desthuilliers –

+0

第一个片段是如何在两个模型之间建立简单(非值)多对多关系的示例。第二个片段是如何通过中间模型手动创建多对多关系的示例。你必须实际选择一个或另一个。 –

+0

好的,现在感谢得多了。 –