Django:存储分层数据

时间:2010-07-29 12:32:09

标签: django model tree sqlobject

我正在尝试将文档的各个部分存储在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,predecessor_section)并通过调用它们的每个保存方法来存储它们。但是,当我在保存它之后查看表时,即使在保存之前我已经附加了对象,也没有设置parent_section_id和predecessor_section_id。

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

对此有何看法?

干杯, 最大

2 个答案:

答案 0 :(得分:0)

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

分配外键时,会复制相关(目标)对象的ID。因为在分配关系(parent_section,predecessor_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 :)

答案 1 :(得分:0)

在将它们保存在Django ORM中之前,

对象没有id。

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

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