django - ManyToManyField - 在一个模型中跨越字段

时间:2012-05-20 22:46:54

标签: django many-to-many

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

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

现在假设我们有节点a和b。如果我为b django添加一个(因为'对称'属性)将添加b作为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)

但当然这个根本不起作用。

知道如何解决这个问题吗?

提前致谢, 格雷格

2 个答案:

答案 0 :(得分:4)

你可能想尝试这样的事情:

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>]

使用此模式,您可以设置从 - 到关系。 outs将是明确的,ins将是一种关系。也许这会有用吗?

Node对象上的edges_upedges_down关系也可以让您找到关系边缘。

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

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

这里的名字可能不清楚。我有点像“上游”和“下游”的概念

答案 1 :(得分:0)