gpt4 book ai didi

django - ManyToManyField - 在一个模型中交叉字段

转载 作者:行者123 更新时间:2023-12-02 22:41:54 27 4
gpt4 key购买 nike

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

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

现在假设我们有节点 a 和 b。如果我在 b 中添加 a,django(因为“对称”属性打开)将在 a 中添加 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)

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

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

提前致谢,格雷格

最佳答案

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

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

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

关于django - ManyToManyField - 在一个模型中交叉字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10677860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com