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

时间:2018-03-09 14:11:44

标签: python django database relational-database

如何在一组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

问题是Mid-level元素的模型不能同时将Mid-level元素和Top-level元素作为父元素。我能想到的解决方案是:

中级模型中的两个外键

中级模型可以与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始终链接到其他Mid。此解决方案的问题是Top具有一些我不想添加到Mid的唯一属性,如果可以避免的话。

使用通用关系

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

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

1 个答案:

答案 0 :(得分:1)

答案可能是:使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