我正在尝试创建一个代表图节点的模型。
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)
但当然这个根本不起作用。
知道如何解决这个问题吗?
提前致谢, 格雷格
答案 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_up
和edges_down
关系也可以让您找到关系边缘。
n1.edges_down.all()
# [<Edge: Edge object>]
n2.edges_up.all()
# [<Edge: Edge object>]
这里的名字可能不清楚。我有点像“上游”和“下游”的概念
答案 1 :(得分:0)