2

我正在尝试创建一个表示图形节点的模型。

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

现在假设我们有节点 a 和 b。如果我在 for b django 中添加 a (因为'对称'属性打开)将添加 b 作为 for a。

我不知道如何按照我设置 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>]

使用此模式,您将设置从到到的关系。theouts将是明确的,并且 theins将是一个关系。也许这会起作用?

Node 对象上的edges_upedges_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 回答