【问题标题】:Django: Store Hierarchical DataDjango:存储分层数据
【发布时间】:2010-07-29 21:37:00
【问题描述】:

我正在尝试将文档的各个部分存储在 Django 应用程序中。模型如下:

class Section(models.Model):
  project = models.ForeignKey(Project)
  parent_section = models.ForeignKey('Section', blank=True, null=True, related_name='child_set')
  predecessor_section = models.ForeignKey('Section', blank=True, null=True, related_name='predecessor_set')
  name = models.CharField(max_length=100)
  text = models.TextField(blank=True, null=True)

我创建了很多部分,链接它们(parent_section、previous_section)并通过调用它们的每个保存方法来存储它们。但是,当我在保存后查看表时,没有设置 parent_section_id 和前辈_section_id,即使我在保存之前附加了对象。

我认为这与某些 parent_section 实例没有分配 id 的事实有关,因为它们的实例尚未存储,但使用手动事务无法解决问题。

对此有什么想法吗?

干杯, 最大

【问题讨论】:

  • 我只是尝试在实际实例之前存储父引用和前驱引用,但它也没有帮助。

标签: django model tree sqlobject


【解决方案1】:

在将它们保存在 Django ORM 中之前,对象没有 ID。

所以我想说你需要 save() 对象,然后在你的父/子部分中引用它(并重新保存这些部分)。

但是,将 prec 和 next 存储为指针的另一种选择是存储一个 sequence_index(间隔 10 以允许进一步插入而无需重新排序)并按此索引排序。

【讨论】:

  • 另一个样本将有序数据存储在数据库中:stackoverflow.com/questions/547022/how-do-i-store-orders#547076
  • 扫描所有实体两次并调用 save() 也应该有效(假设最初设置了引用)。由于某种原因,它不...
  • 好的。我想我解决了。你是对的,重新设置关系是必要的。我存储了一次实体,在第二遍中,我手动设置了关系的 ID(section.parent_section_id = section.parent_section.id)。 Django 似乎仅在分配关系时才自动设置这些。已经附加的关系在 save() 中被忽略。
【解决方案2】:

尝试对所有对象执行 save(),然后更新它们的关系,然后再次 save() 所有对象。

当您分配外键时,相关(目标)对象的 id 会被复制。因为在分配关系(parent_section,previous_section)时,相关对象还没有 id,你会得到一个时髦的结果:

A = Section(name='A')
B = Section(name='B')
B.parent_section = A
A.save() 
B.save()
B.parent_section # this will say A
B.parent_section_id # this will say **None**

但这应该可行:

A = Section(name='A')
B = Section(name='B')
A.save() 
B.save()
B.parent_section = A
B.parent_section # this will say A
B.parent_section_id # this will say A.id
B.save() # don't forget this one :)

【讨论】:

  • 不太清楚“更新他们的关系”是什么意思。在保存实体之前已经设置了关系。但是我保存了所有实体两次,这意味着在第一次运行中未保留的任何关系都将在第二次中保留。 - 关系没有保存...
  • 这行不通。相关对象在将它们分配到关系中之前需要有它们的 id。在 2 个循环中执行:第一次创建所有对象,仅使用它们的内部属性(与其他 Section 对象无关),然后 save() 所有对象。然后在另一个循环中分配所有关系(parent_section,previous_section),然后再次 save()。
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 2010-11-03
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多