2014-08-29 136 views
1

在Django項目的關係,我想基本上代表了一個城市的環境:一對夫婦的建築和街道,在它們之間移動的可能性。爲了實現這一點,我挑選的graph表示:每個節點表示房間或那條道,並且每個邊緣表示兩個節點之間行進的可能性。訪問父母從兒童模型

所以我有一個第一應用graphs具有以下GraphNodeEdge型號:

class Graph(models.Model): 
    label = models.CharField(max_length=200) 

class Node(models.Model): 
    graph = models.ForeignKey(Graph) 

    # some methods 

class Edge(models.Model): 
    node_a = models.ForeignKey(Node, related_name='node_a') 
    node_b = models.ForeignKey(Node, related_name='node_b') 

    # some methods 

在這些抽象的概念之上,我想建立更具體的:圖形實際上是一個是地圖,節點可以在地圖中定義具有定義的座標的街道或房間,並且邊緣表示兩個節點之間的路徑。在第二cities應用程序,我主要有:

from graphs.models import * 

class Map(Graph): 
    # ... 

class Element(Node): 
    # ... 

class Path(Edge): 
    # ... 

這是繼承來的方式和在那裏我失去了我自己用的Django模型的關係。

1/I希望充實ElementMap之間現有ForeignKey添加座標(x,y)時,因爲一個元素具有在地圖空間中的特定位置。但我不確定這是可能的。我應該定義一個新的關係(如it's been done here)?在建築方面它會不會很糟糕?如果這是要做的事情,我該如何將額外的數據(即座標)添加到這個關係? (我知道m2m-through,我不需要m2m關係就是我需要的)。

2 /通過繼承,一個Element(這是一個Node)屬於Map(這是一個Graph),但顯然我不能做到這一點:

>>> map = Map.objects.get(id=1) # suppose it exists and has a few Elements 
>>> map_elements = map.element_set().all() 

AttributeError: 'Map' object has no attribute 'element_set' 

有沒有辦法,我可以告訴Django使用Map的父node_set找到它的元素?

或者,也許我會走錯路了,應該放棄這一整個產業的想法?我非常喜歡它,因爲它允許我在不同的應用程序中保留所有綁定到圖形操作的邏輯。

+0

我目前的假設:我將不得不在'Map'和'Element'之間重新定義FK,可能需要一箇中間位置模型,保存座標... – Anto 2014-08-29 15:12:11

+0

什麼是你需要「圖表」模型類嗎? – 2014-08-29 15:41:05

+0

我主要用它來放置'count_nodes/edges'等方法,這也是我的渲染器獲取它的表示的對象。 – Anto 2014-08-29 15:44:43

回答

1

這裏是我會做到這一點,才能真正描述連接或斷開圖形的任何集合。只有你設置的問題沒有阻止你連接來自不同圖表的兩個節點,這應該是一個錯誤。

class Graph(models.Model): 
    label = models.CharField(max_length=200) 

class Node(models.Model): 
    graph = models.ForeignKey(Graph) 
    x = models.IntegerField() 
    y = models.IntegerField() 
    neighbors = models.ManyToMayField('self') 

除非您還試圖描述方向圖,否則不需要實際的邊緣模型。在這種情況下,這將是:

class Graph(models.Model): 
    label = models.CharField(max_length=200) 

class Node(models.Model): 
    graph = models.ForeignKey(Graph) 
    x = models.IntegerField() 
    y = models.IntegerField() 

class Edge(models.Model): 
    start = models.ForeignKey(Node, related_name='start_node_set') 
    end = models.ForeignKey(Node, related_name='end_node_set') 

你是正確的,在這種情況下,忘記繼承,那就是使用它非常錯誤的地方。 此外,如果你想以可視化的實際地圖上的圖形,建議使用谷歌地圖和GeoDjango內置。但這是一個單獨的主題:)

+0

非常感謝您的時間閱讀和回答這個問題。我一直在探索你正在談論的m2m解決方案(關於這個主題的一個很好的閱讀:[自引用多對多](https://charlesleifer.com/blog/self-referencing-many-many-通過/)),但後來又回到了一個更簡單的實現。我想我會放棄繼承的瘋狂,然後離開'graph'應用程序。 – Anto 2014-08-29 15:52:57