2

グラフノードを表すモデルを作成しようとしています。

class Node(models.model):
    ins = models.ManyToManyField("self", null=True, blank=True)
    outs = models.ManyToManyField("self", null=True, blank=True)

ここで、ノードaとbがあるとしましょう。a as in for b djangoを追加すると(「対称」属性がオンになっているため)、b as inforaが追加されます。

a->bを設定する方法がわかりません。b<-aが自動的に設定されます。

私は関係のためにいくつかの中流階級を作ることを考えましたが、それがどのように機能するかは実際にはわかりません。文字通りそれを書く方法。

私はそれがそのようなものだと思います:

class Node(models.Model):
    ins = models.ManyToManyField("self", null=True, blank=True, through="Edge")
    outs = models.ManyToManyField("self", null=True, blank=True, through="Edge")

class Edge(models.Model):
    node1_ins = models.ForeignKey(Node)
    node2_outs = models.ForeignKey(Node)

しかしもちろん、これはまったく機能しません。

それを解決する方法はありますか?

よろしくお願いします、グレッグ

4

2 に答える 2

5

次のようなものを試してみてください。

from django.db import models

class Node(models.Model):
    outs = models.ManyToManyField("self", null=True, blank=True, 
        symmetrical=False, related_name="ins", through='Edge')

class Edge(models.Model):
    from_node = models.ForeignKey(Node, related_name='edges_down')
    to_node = models.ForeignKey(Node, related_name='edges_up')

複数のm2mフィールドを管理するには、複数の「スルー」テーブルが必要であり、面倒になることがわかりました。

n1 = Node.objects.create()
n2 = Node.objects.create()
edge = Edge.objects.create(from_node=n1, to_node=n2)

print n1.outs.all()
#[<Node: Node object>]
print n1.ins.all()
# []

print n2.outs.all()
# []
print n2.ins.all()
# [<Node: Node object>]

このパターンを使用すると、from-to関係を設定できます。はouts明示的であり、insは関係になります。多分これはうまくいくでしょうか?

Nodeオブジェクトのedges_upandedges_downリレーションシップでは、リレーションシップエッジを見つけることもできます。

n1.edges_down.all()
# [<Edge: Edge object>]

n2.edges_up.all()
# [<Edge: Edge object>]

ここでの名前は不明確かもしれません。「上流」と「下流」のコンセプトが好きです

于 2012-05-21T00:05:44.277 に答える
0

対称をTrueに設定できます。

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.symmetrical

于 2012-05-20T22:52:23.170 に答える