2010-07-29 63 views
4

我試圖在Django應用程序中存儲文檔的各個部分。該模型是這樣的: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作爲實例已尚未存儲,但使用人工交易未能解決的問題做。

上有什麼想法?

乾杯, 最大

+0

我只是試圖存儲實際實例之前,家長和前作參考,但它並沒有幫助。 – Max 2010-07-29 12:34:41

回答

0

對象在將它們保存在Django ORM中之前,您沒有ID。

所以我說你需要保存()的對象,然後在你的父/子段引用它(並重新保存的部分)。

然而,另一種選擇存儲PREC和下一個作爲指針是存儲一個sequence_index(由10間隔開以允許插入件進一步重新排序wiothout)本索引和順序。

+0

另一個示例存儲在數據庫中的有序數據:http://stackoverflow.com/questions/547022/how-do-i-store-orders#547076 – makapuf 2010-07-29 13:04:33

+0

兩次掃描所有的實體和調用save()也應該工作(因爲參考文獻是最初設定的)。由於某種原因,它不... – Max 2010-07-29 13:22:28

+0

好的。我想我解決了它。你是對的,再次設置關係是必要的。我存儲實體一次,並在第二遍,我手動設置關係的ID(section.parent_section_id = section.parent_section.id)。 Django似乎只在關係被分配時自動設置它們。已經連接的關係在save()中被忽略。 – Max 2010-07-29 13:31:12

0

嘗試做保存()上所有的對象,然後更新它們之間的關係,然後保存()所有的人再次。

當你指定一個外鍵,相關的(目標)對象的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 :) 
+0

不太清楚你的意思是「更新他們的關係」。關係在保存實體之前已經設置好了。但是我保存了所有實體兩次,這意味着任何在第一次運行中沒有保留的關係都會在第二次運行中持續存在。 - 關係沒有保存... – Max 2010-07-29 13:10:27

+0

它不會工作。相關對象在將它們分配給關係之前需要有它們的ID。在2個循環中執行:首先創建所有對象,僅使用其內部屬性(與其他節對象無關),然後保存()所有對象。然後在另一個循環中分配所有關係(parent_section,predecessor_section),然後再次保存()。 – 2010-07-29 13:32:05

+0

是的,你是對的。看到我的帖子上面。 – Max 2010-07-29 13:53:27