我正在构建一个需要一对多模型关系的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'))
如何将作业添加到用户模型中的一对多字段以保存用户作业?
答案 0 :(得分:0)
到目前为止,我觉得它看起来不错。您要做的是首先创建对象。
Job
然后将该作业添加到job=Job(user=..., etc.)
job.save()
对象。
User
答案 1 :(得分:0)
User
指向Job
而Job
指向User
,follow 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()