如何使用 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'
有一个外键关系。这看起来很老套,因为如果你想向下移动层,你必须检查每一层的两个键——当你知道只有第一个 Mid
与 Top
有关系,而其他所有东西都有与 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 到 Top
和 Mid
。缺点是这给代码增加了很多复杂性。
这是我稍后发现的一个相关问题:
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
。
如何在一组 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'
有一个外键关系。这看起来很老套,因为如果你想向下移动层,你必须检查每一层的两个键——当你知道只有第一个 Mid
与 Top
有关系,而其他所有东西都有与 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 到 Top
和 Mid
。缺点是这给代码增加了很多复杂性。
这是我稍后发现的一个相关问题: 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
。