django - 在 Django 数据库中建模“网络”
问题描述
我有一个用例,其中我有一个具有以下关系的“网络”;在 Django 中对此进行建模的最佳方法是什么?
- 有一个逻辑顶层(如果需要,可以建模为单个“非常顶层”节点)
- 底部有逻辑叶子
- 节点可以与上层和/或下层中的节点有关系,但不能与兄弟姐妹有关系
因此,就像硬币从引脚中掉下来的中国游戏一样,从上到下有多条路线,但遍历总是有效的,尽管在其他地方以某种方式确定(在我的情况下实际上是用户输入)。
我尝试过使用多对多关系,但看不到如何发现关系的顶部和底部;我是否需要切换到多个 OneToMany 关系以实现独立的子关系和父关系?
解决方案
我不认为你可以在数据结构中明确表示这种图,但你可以在节点的创建/更新中使用语义操作来实现它。假设您有一个节点模型:
class Node(models.Model):
connections = ManyToManyField(Node)
layer_level = IntegerField(null=False, default=1)
然后,在构造函数和魔法设置器__setattr__
中,您可以检查节点的连接是否都具有大于或小于节点本身的层级别,如果它们相等则引发异常。我承认在 Django“插入”中,模型实例的字段设置可能比覆盖__setattr__
方法更复杂,但这超出了这个答案的范围。
关键是您可以建立一个具有所需结构但限制较少的模型,然后对创建/更新实施限制,而不是使它们隐含在模型结构中。后者将是一个更好的解决方案,但也是关系数据库和/或 Django 的 ORM 可能无法实现的解决方案。
推荐阅读
- c# - 如何解决构建问题 NETSDK1056
- r - 如何将 R Bar Plot 格式化为带有轴标签的中心条
- c++ - rpcndr 和 cstddef 中的模糊字节定义
- oracle - Oracle触发器根据另一个表中的值限制空值
- javascript - undefined 不是函数(评估 't.matches(e)')
- android - 已创建数据库但未在 SQLite 中创建表
- android - 当 BehaviorSubject 的 subscribe 完成 Activity 时,应用程序崩溃了
- python - 是否有一种将零列和行插入 numpy 数组的内存有效方法?
- java - RecyclerView:检测到不一致。无效的项目位置 - 为什么?
- java - 如何在百里香中将对象 id 设置为 div id?