2013-01-09 13 views
1
class c(models.Model): 
    f = models.ManyToManyField(
     'self', 
     blank=True, 
     null=True, 
     related_name='child_set' 
    ) 

我可以這樣做:Django的:如何遵循多對多( '自我')向後

c.objects.get(pk="1").f 

但我怎麼通過 '_set' 得到什麼?

c.objects.get(pk="1").child_set 

不起作用

,我需要這樣的:

{name:A,parent:[]} 
{name:B,parent:[A]} 
{name:C,parent:[A,B]} 

C.parent.all() == [A,B] 
A.parent_set.all() == [B,C] 
+0

'instance.f'已經一套 - 爲什麼你需要'instance.child_set'? – DanielB

回答

0

對於ManyToManyField s表示參考self,不創建一個反向的關係。這是因爲它沒有用處 - 它將包含所有引用自身的關係 - 這是前向關係的作用。

你會發現不管你說什麼related_name應該被設置爲%(field)s_rel_+(尾隨+阻止關係被創建)。因此你可以使用f

+0

噢,我應該提到你可以使用'c._meta.get_field_by_name('f')[0] .related_query_name()' – DanielB

+0

檢查相關的名稱(爲此目的,而不是生產)感謝您的關注:)我想要構建一個樹形結構,每個節點都應該註冊從根到它們的位置的路徑 (對於長度超過一個的路徑,需要M2M) 我想要達到特定節點的所有父節點(路徑)通過** c.child_set ** 和** cf **,將所有連接的孩子都送到特定父母 – user1960087

+0

通過這個定義,既不是「父母」也不是「孩子」 - 他們更像是「兄弟姐妹」。這種多對多的結構更像是一個網絡而不是一棵樹。對於樹結構,每個節點只能有一個父節點,因此您可以使用「ForeignKey」關係捕獲該節點。 – DanielB

0

一個很好的解決方案是將C模型分解爲兩個模型並創建一個OneToOneField給另一個。這樣,結構就變成了一棵樹而不是網絡。下面的代碼說明了我的觀點:

class Boo(models.Model): 
    name = models.CharField(max_length=20) 

class Coo(models.Model): 
    boo = models.OneToOneField(Boo) 
    foo = models.ManyToManyField(
      Boo, 
      blank=True, 
      null=True, 
      related_name='child_set' 
    ) 

現在你可以這樣做:

Coo.objects.get(pk=1).foo 

然後你就可以用 '_set' 得到:

Coo.objects.get(pk=1).boo.child_set