如何在一组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'
具有外键关系。这看起来很糟糕,因为如果你想向下移动图层,你必须检查每一层的两个键 - 当你知道只有第一个Mid
与Top
有关系时,其他一切都有与Mid
的关系。
class Mid(models.Model):
top_parent = models.ForeignKey(Top, blank=True, null=True)
mid_parent = models.ForeignKey('self')
完全取消Top
,以便Mid
始终链接到其他Mid
。此解决方案的问题是Top
具有一些我不想添加到Mid
的唯一属性,如果可以避免的话。
使用通用关系,以便Mid
可以链接到Top
和Mid
。缺点是这会给代码增加很多复杂性。
这是我稍后发现的一个相关问题: Django: How do I model a tree of heterogeneous data types?
答案 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
。