Django无向图

Bry*_*ard 5 django graph django-models

我想在Django中构建一个无向图.我已经为节点类构建了一个带有两个外键(第一个,第二个)的边模型,但是与related_name存在冲突.我可以使用first_set和second_set,但由于图表是无向的,因此无论是喜欢还是来自它都无关紧要.处理这种情况的推荐方法是什么?

编辑:以下是我正在使用的模型:

class Node(models.Model):
    #some irrelevant stuff

class Edge(models.Model):
    #some other stuff
    first = models.ForeignKey('Node',related_name=None)
    second = models.ForeignKey('Node',related_name=None)
Run Code Online (Sandbox Code Playgroud)

some_node.connected_nodes_set想要的是一个与RelatedManager有关的东西,类似于我使用related_names时为first_set或second_set设置的东西,除了它将具有单个可以到达的所有节点边缘,而不仅仅是那些可以在一个方向上到达的边缘.

Jef*_*rry 5

我必须做一些与我目前的项目类似的事情.我的解决方案是拥有ManyToManyField与我的Node模型相当的东西.像这样的东西:

class Node(models.Model):
    adjacent = models.ManyToManyField("self", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

请注意,上面的"self"是必要的,以允许ManyToManyField指向自身.

使用此代码,N可以使用找到与给定节点相邻的所有节点N.adjacent.all().

  • 您必须确保每次创建"边缘"时都会创建反向关系.在我的头顶之外,应该可以通过覆盖`Edge`的`save`方法自动完成. (3认同)
  • 虽然Jeff的问题在于,如果你这样做,这不是一个无向图,而是一个带有一对来回链接的有向图.虽然它在某种意义上是实用的,但它有很多意想不到的拓扑结果.无论如何,似乎django本身并不支持它.然而,可能通过另一个模型放置M2M关系并向模型中抛出一些逻辑以重新创建所需的关系.不是一个完全有效的答案,但这就是生活. (2认同)