Python 如何在django中向一对多关系添加对象?

Python 如何在django中向一对多关系添加对象?,python,django,Python,Django,我正在构建一个django web应用程序,它需要一对多模型关系。我读了文档,上面说在模型字段中使用外键 在我的例子中,每个用户都需要有一个带有作业模型的一对多字段,该字段将跟踪该用户完成的作业 在django,我相信它是这样表示的: class User(AbstractBaseUser, PermissionsMixin): ... job_history = models.ForeignKey(Job, on_delete=models.CASCADE) 作业模型如下所示

我正在构建一个django web应用程序,它需要一对多模型关系。我读了文档,上面说在模型字段中使用
外键

在我的例子中,每个用户都需要有一个带有作业模型的一对多字段,该字段将跟踪该用户完成的作业

在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\u history
one-to-many字段中。但是我不知道怎么写这个。到目前为止,我的观点是:

@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'))

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

我认为到目前为止效果不错。您要做的是首先创建
Job
对象

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

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

我觉得到目前为止还不错。您要做的是首先创建
Job
对象

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

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

用户
尽可能指向
作业
作业
尽可能指向
用户,这是多余的

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

user = User.objects.first()
user.jobs.all()  # shows all jobs for the user. 
(请注意,如果未将相关名称设置为
作业
,则它将是
user.job\u set.all()

因此,在您看来,这应该足够了:

@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()
实际上,您甚至不需要从数据库中获取用户实例,但可以执行以下操作:


编辑:

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

@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()

用户
尽可能指向
作业
作业
尽可能指向
用户,这是多余的

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

user = User.objects.first()
user.jobs.all()  # shows all jobs for the user. 
(请注意,如果未将相关名称设置为
作业
,则它将是
user.job\u set.all()

因此,在您看来,这应该足够了:

@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()
实际上,您甚至不需要从数据库中获取用户实例,但可以执行以下操作:


编辑:

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

@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()

作业模型中的用户字段指作业的创建者。即使我创建了另一个与用户字段相同但名称不同的字段来跟踪所有作业,我仍然需要将其与每个用户(而不是每个作业)一起存储@arieOkay,从你的模型上看,这并不明显。尽管如此,在视图中连接用户和作业仍应工作相同。如果为两个作业雇用了相同的用户,则行
user.job\u history\u id=job\u pk
将同时保存这两个作业,或者最近添加的作业将覆盖先前存储在字段中的旧作业@阿里厄姆。。。我猜您的数据模型目前无法反映您的需求<代码>用户
有一个FK to
作业
,因此一个作业可以有多个用户,但一个用户只能有一个作业。如果一个作业只能有一个用户,我会像最初建议的那样颠倒关系。没有任何东西可以阻止您将另一个
创建人
字段添加到
作业
模型以指示创建者。但是,如果作业可以有多个用户,并且用户可以有多个作业,则您正在寻找一个
manytomy
关系。每个用户可以有多个作业。每个作业只能有一个用户。这由多对一表示??作业模型中的用户字段指的是作业的创建者。即使我创建了另一个与用户字段相同但名称不同的字段来跟踪所有作业,我仍然需要将其与每个用户(而不是每个作业)一起存储@arieOkay,从你的模型上看,这并不明显。尽管如此,在视图中连接用户和作业仍应工作相同。如果为两个作业雇用了相同的用户,则行
user.job\u history\u id=job\u pk
将同时保存这两个作业,或者最近添加的作业将覆盖先前存储在字段中的旧作业@阿里厄姆。。。我猜您的数据模型目前无法反映您的需求<代码>用户
有一个FK to
作业
,因此一个作业可以有多个用户,但一个用户只能有一个作业。如果一个作业只能有一个用户,我会像最初建议的那样颠倒关系。没有任何东西可以阻止您将另一个
创建人
字段添加到
作业
模型以指示创建者。但是,如果作业可以有多个用户,并且用户可以有多个作业,则您正在寻找一个
manytomy
关系。每个用户可以有多个作业。每个作业只能有一个用户。这表示为多对一?