Djangoプロジェクトでは、基本的に都市環境を表現したいと思います。いくつかの建物と通りの間を移動する可能性があります。これを実現するために、グラフ表現を選択しました。各ノードは部屋または道路の一部を表し、各エッジは2つのノード間を移動する可能性を表します。
だから私はgraphs
次のGraph
、Node
そしてEdge
モデルを持つ最初のアプリを持っています:
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
これらの抽象的な概念に加えて、より具体的な概念を構築したいと思います。グラフは実際にはマップであり、ノードはマップ内で定義された座標を持つ通りまたは部屋になり、エッジは2つのノード間のパスを表します。2番目のcities
アプリでは、基本的に次のものがあります。
from graphs.models import *
class Map(Graph):
# ...
class Element(Node):
# ...
class Path(Edge):
# ...
ここで継承が邪魔になり、Djangoモデルの関係で自分自身を失っています。
1 / I既存濃縮したいForeignKey
との間Element
及びMap
要素がマップの空間内の特定の場所を持っているので、座標(x、y)を追加します。しかし、それが可能かどうかはわかりません。新しい関係を定義する必要がありますか(ここで行われているように)?建築的にはひどいことではないでしょうか。そして、それがやるべきことである場合、どうすればこの関係にデータ(つまり座標)を追加できますか?(私はm2mについて知っています-スルー、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'
Map
の親node_set
を使用して要素を見つけるようにDjangoに指示する方法はありますか?
それとも、私は間違った方向に進んでいて、この継承のアイデア全体を破棄する必要がありますか?別のアプリでのグラフ操作にバインドされたすべてのロジックを維持できるので、私はそれが非常に好きです。
これが私がそれを行う方法であり、接続されたグラフまたは切断されたグラフのコレクションを本当に説明することができます。その設定で発生する唯一の問題は、異なるグラフから2つのノードを接続することを妨げるものではなく、エラーになるはずです。
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')
あなたは正しいです、この場合、継承を忘れてください、それはそれを使うのに非常に間違った場所です。また、実際の地図上でグラフを視覚化したい場合は、GoogleマップとGeoDjangoの使用をお勧めします。しかし、それは別の主題です:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加