【问题标题】:how to add a instance of a foreign key to an instance of a model that it points to如何将外键的实例添加到它指向的模型的实例中
【发布时间】:2013-06-19 00:11:34
【问题描述】:

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

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 数据,指示要添加到作业的一些主机(主机表示用户希望运行在主机实例连接到的作业实例中指定的命令的各个主机名)。

hostNames = list()
for p in request.POST:
    if "Host" in p: #Host is put in the input name attribute in the template as a sentinel
        hostNames.append(request.POST[p])
selected = getCheckedJobs() #a list of the jobs to add this host to

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

【问题讨论】:

  • 附带说明,您的null = False, blank = False 是多余的
  • 啊,我不知道

标签: python mysql django foreign-keys models


【解决方案1】:

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

如果正确 - 您需要获取您的 Host 实例,然后将其 job 属性分配为 Job 实例并保存 Host 实例。比如:

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

【讨论】:

  • 谢谢,我以后可以换关系了。
  • 从您需要支持的行为来看,这种关系应该很明显。与多对多关系不同,哪个模型具有外键字段并不是任意的——它决定了多对一关系的方向。
  • 是否有可能代替分层关系(其中一个模型包含另一个模型的一堆副本),我为每个唯一主机和每个唯一作业都有一个实例,并拥有所有相关的之间的引用而不是拥有一堆作业或主机的副本?
  • 我不太清楚你的意思。给定 Job 或 Host 实例没有多个副本。应该决定您的关系结构的问题是: 1) 主持人可以同时拥有多个工作吗? 2)一个作业可以同时有多个主机吗?
  • 是的,我就是这个意思。如果两个模型都定义了一个 ForeignKey,虽然我确定这不是你实现它的方式。
猜你喜欢
  • 2015-11-20
  • 2018-03-23
  • 2014-10-29
  • 2018-06-17
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 2020-03-03
  • 2015-06-17
相关资源
最近更新 更多