Python 如何将外键的实例添加到它所指向的模型的实例中

Python 如何将外键的实例添加到它所指向的模型的实例中,python,mysql,django,foreign-keys,models,Python,Mysql,Django,Foreign Keys,Models,我有一个Django应用程序,其中用户可以安排命令行“作业”在远程系统上运行。这是我的models.py定义的工作和外键关系 class Job(models.Model): name = models.CharField(max_length = 250, null = False, blank = False) user = models.CharField(max_length = 30, null = False, blank = False) command =

我有一个Django应用程序,其中用户可以安排命令行“作业”在远程系统上运行。这是我的models.py定义的工作和外键关系

class Job(models.Model):
    name = models.CharField(max_length = 250, null = False, blank = False)
    user = models.CharField(max_length = 30, null = False, blank = False)
    command = models.CharField(max_length = 1000, null = False, blank = False)
    whenToRun = models.DateTimeField('Run Date', null = False, blank = False)
    output = models.CharField(max_length = 100000, null = True, blank = True)

class Host(models.Model):
    job = models.ForeignKey(Job)
    name = models.CharField(max_length = 100, null = False, blank = False)
    hasRun = models.BooleanField(default = False)
接下来,我有一个代码块,其中包含一些POST数据,指示要添加到作业中的一些主机(主机表示用户希望运行主机实例连接到的作业实例中指定的命令的各个主机名)


现在我已经组装好了名称和要添加它们的作业,我意识到我不知道如何获取作业实例并添加与其关联的主机实例。谁能告诉我怎么做?提前感谢您的帮助。

您确定您的关系结构正确吗?使用主机上的外键,每个作业可以有多个主机,但每个主机只能有一个作业。您的评论说“要将此主机添加到的作业列表”-这在这种关系中是不可能的

如果正确-您需要获取主机实例,然后将其
job
属性指定为作业实例并保存主机实例。比如:

# assume selected_job is the job instance
try:
    host = Host.objects.get(name=hostname)
except ObjectDoesNotExist:
    # do something here to handle an unmatched hostname
    pass
host.job = selected_job
host.save()

另一方面,你的
null=False,blank=False
是多余的,我没有意识到这一点。谢谢你,我很可能会在以后切换关系。从你需要支持的行为来看,这种关系应该是显而易见的。与多对多关系不同的是,确定多对一关系方向的外键字段不是任意的。是否可以不使用层次关系(其中一个模型包含另一个模型的一组副本)而使用外键字段每个唯一的主机和每个唯一的作业都有一个实例,并且在它们之间有所有相关的引用,而不是一堆作业或主机的副本?我不太清楚你的意思。给定作业或主机实例没有多个副本。决定你的关系结构的问题是:1)一个主持人能否同时拥有多个工作?2) 一个工作可以同时有多个主机吗?是的,这就是我的意思。如果两个模型都定义了一个ForeignKey,尽管我确信这不是实现它的方式。
# assume selected_job is the job instance
try:
    host = Host.objects.get(name=hostname)
except ObjectDoesNotExist:
    # do something here to handle an unmatched hostname
    pass
host.job = selected_job
host.save()