首页 > 解决方案 > 在 Django 数据库中建模“网络”

问题描述

我有一个用例,其中我有一个具有以下关系的“网络”;在 Django 中对此进行建模的最佳方法是什么?

  1. 有一个逻辑顶层(如果需要,可以建模为单个“非常顶层”节点)
  2. 底部有逻辑叶子
  3. 节点可以与上层和/或下层中的节点有关系,但不能与兄弟姐妹有关系

因此,就像硬币从引脚中掉下来的中国游戏一样,从上到下有多条路线,但遍历总是有效的,尽管在其他地方以某种方式确定(在我的情况下实际上是用户输入)。

我尝试过使用多对多关系,但看不到如何发现关系的顶部和底部;我是否需要切换到多个 OneToMany 关系以实现独立的子关系和父关系?

标签: djangodatabase

解决方案


我不认为你可以在数据结构中明确表示这种图,但你可以在节点的创建/更新中使用语义操作来实现它。假设您有一个节点模型:

class Node(models.Model):
    connections = ManyToManyField(Node)
    layer_level = IntegerField(null=False, default=1)

然后,在构造函数和魔法设置器__setattr__中,您可以检查节点的连接是否都具有大于或小于节点本身的层级别,如果它们相等则引发异常。我承认在 Django“插入”中,模型实例的字段设置可能比覆盖__setattr__方法更复杂,但这超出了这个答案的范围。

关键是您可以建立一个具有所需结构但限制较少的模型,然后对创建/更新实施限制,而不是使它们隐含在模型结构中。后者将是一个更好的解决方案,但也是关系数据库和/或 Django 的 ORM 可能无法实现的解决方案。


推荐阅读