如何创建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)
。这将创建Job
到Applicant
一到一个一对多的关系,然后多种关系从Applicant
到User
。
正如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"),]
我不明白您的答案中的代码的第一部分是什么以及什么其目的是。你能详细说明一下吗? @bruno desthuilliers –
第一个片段是如何在两个模型之间建立简单(非值)多对多关系的示例。第二个片段是如何通过中间模型手动创建多对多关系的示例。你必须实际选择一个或另一个。 –
好的,现在感谢得多了。 –
为什么'用户'上的OneToOne字段?这将阻止用户应用于多个工作。 –
不,在这种情况下,您会创建另一个“申请人”对象。它意味着每个“申请人”对象只有一个用户。 – themanatuf
用户上的ForeignKey已经意味着“每个申请人只有一个用户” - 否则你需要一个ManyToManyField--而OneToOne字段的确可以为同一用户创建许多申请人(事实上,对我来说这实在是太惊奇了,我以为Django会防止这种情况,并且IIRC it_did_阻止它),它至少会阻止通过user.applicant_set.all()从用户那里获得应用程序。 OneToOne字段主要是为了表达一种“是”的关系,而不是“有”。 –