如何在django中将对象添加到一对多关系中?

时间:2017-03-21 16:48:51

标签: python django

我正在构建一个需要一对多模型关系的django Web应用程序。我阅读了文档,并说它在模型字段中使用ForeignKey

在我的情况下,每个用户都需要一个具有作业模型的一对多字段,该字段将跟踪该用户完成的作业。

我认为django中的代表如此:

class User(AbstractBaseUser, PermissionsMixin):
    ...
    job_history = models.ForeignKey(Job, on_delete=models.CASCADE)

工作模式如下所示:

class Job(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, 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)

    def __str__(self):
        return self.title

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

在我看来,我想在job_history一对多字段中添加作业。我不知道怎么写这个。这是我到目前为止的观点:

@login_required
def job_hire(request, account_pk, job_pk):
    user = get_object_or_404(account_pk)
    job = get_object_or_404(job_pk)

    # I now need to save the job object in the one to many field of the user object. But how?

    messages.success(request, "You have hired an applicant.")
    return HttpResponseRedirect(reverse('jobs:find'))

如何将作业添加到用户模型中的一对多字段以保存用户作业?

2 个答案:

答案 0 :(得分:0)

到目前为止,我觉得它看起来不错。您要做的是首先创建对象。

Job

然后将该作业添加到job=Job(user=..., etc.) job.save() 对象。

User

答案 1 :(得分:0)

User指向JobJob指向Userfollow relationships backward是多余的。

user上的Job字段应该足够了。 您仍然可以通过以下方式查找User的所有作业:

user = User.objects.first()
user.jobs.all()  # shows all jobs for the user. 

(请注意,如果您没有为user.job_set.all()设置相关名称,则为jobs

所以在你看来,这应该足够了:

@login_required
def job_hire(request, account_pk, job_pk):
    user = get_object_or_404(User, pk=account_pk)
    job = get_object_or_404(Job, pk=job_pk)
    job.user = user
    job.save()

实际上,您甚至不需要从数据库中获取用户实例,但可以执行this

@login_required
def job_hire(request, account_pk, job_pk):
    job = get_object_or_404(Job, pk=job_pk)
    job.user_id = account_pk
    job.save()

编辑:

如果您想保留两个用户字段并希望将作业与用户关联,则机制仍然相同:

@login_required
def job_hire(request, account_pk, job_pk):
    user = get_object_or_404(User, pk=account_pk)
    user.job_history_id = job_pk
    # or:
    # job =get_object_or_404(Job, pk=job_pk)
    # user.job_history = job
    user.save()