如何使用 Django 模型表示数据中未知数量的层

How to represent an unknown number of layers in data with Django models

如何在一组 Django 数据库模型中最好地表示以下数据结构:

Top level element
  An unknown number n of Mid level element(s), n >= 1
    Low level element

例如:

Top
  Mid
    Mid
      Mid
        Bottom

Top
  Mid
    Bottom

问题是中级元素的模型不能同时具有中级元素和顶级元素作为父元素。我能想到的解决方案是:

中级模型中的两个外键

中级模型可以与 Top 有一个外键关系,另一个与 'self' 有一个外键关系。这看起来很老套,因为如果你想向下移动层,你必须检查每一层的两个键——当你知道只有第一个 MidTop 有关系,而其他所有东西都有与 Mid.

的关系
class Mid(models.Model):
    top_parent = models.ForeignKey(Top, blank=True, null=True)
    mid_parent = models.ForeignKey('self')

改为将 Top 设为 Mid 的实例

完全消除 Top,这样 Mid 总是 link 到其他 Mid。这个解决方案的问题是 Top 有一些我不想添加到 Mid 的独特属性,如果可以避免的话。

使用泛型关系

使用通用关系,以便 Mid 可以 link 到 TopMid。缺点是这给代码增加了很多复杂性。

这是我稍后发现的一个相关问题: Django: How do I model a tree of heterogeneous data types?

答案可能是:使Top成为Mid的代理模型。

class Mid(models.Model):
    mid_parent = models.ForeignKey('self')

class Top(Mid):
    # here you have your unique properties
    class Meta:
        proxy = True

由于 mid_parent 字段是必需的,因此 Top 实例可以将其自身设置为 mid_parent