2017-03-21 62 views
0

我正在构建一个需要一对多模型关系的django web应用程序。我阅读了文档,并说它在模型字段中使用ForeignKey如何将对象添加到django中的一对多关系中?

就我而言,每个用户都需要拥有一个一对多的工作模型领域,该工作模型将跟踪该用户完成的工作。

这在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

我认为目前看起来不错。你想要做的是首先创建Job对象。

job=Job(user=..., etc.) 
job.save() 

然后你作业添加到User对象。

user=User(job_history=job, ...) 
user.save() 
0

这是多余的,一个User指向JobJob指向User,你可以follow relationships backward

Job上的user字段应该足够了。 您仍然可以通过查询为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() 
+0

在用户现场工作模式是指工作的创造者。即使我创建了与用户字段相同的另一个字段,但使用不同的名称来跟踪所有作业,我仍然需要将这个字段与每个用户而不是每个作业一起存储。 @arie –

+0

好的,从看你的模型来看,这并不明显。尽管如此,在视图中连接用户和工作应该仍然是一样的。 – arie

+0

如果同一个用户被雇佣两个工作,那么这行'用户'。job_history_id = job_pk'保存它们或将最近添加的作业覆盖先前存储在该字段中的旧作业。 @arie –

相关问题