最近我对Django关于模型继承的一个常见问题。我有一堆不同的模型,我想单独或作为一组显示。读作:查询数据库中的所有内容,或仅查询某个类别(模型)的项目。
最终,我选择了多表继承。我的模型看起来像:
class Unit(models.Model):
etc, etc...
class Child1(Unit):
etc, etc...
class Child2(Unit):
etc, etc...
所以现在我可以查询单位以使所有内容和个别孩子更具体。它运行正常,但我只是查看了为所有单元列表生成的SQL ......它变得相当丑陋!
SELECT "all the fields from all the tables (Unit and Children)"
FROM "Unit"
LEFT OUTER JOIN "Child1" ON ("whatever")
LEFT OUTER JOIN "Child2" ON ("whatever")
LEFT OUTER JOIN "Child3" ON ("whatever")
LEFT OUTER JOIN "Child4" ON ("whatever")
LEFT OUTER JOIN "Child5" ON ("whatever")
基本上,当我获得所有项目的索引视图时,Unit的每个子节点都需要另一个左外连接。
假设我最多有5个单位的子女,并且数据库中最多有200个项目,这是一个交易破坏者吗?我总是可以缓存索引视图,是吗?或者我错过了MTI的另一个问题?书“Django的2个Scoops”绝对反对使用多表继承...到了“不要做它”的观点。但我觉得它解决了我的问题,很容易理解,并且鉴于Django如何处理关系,几乎是一个必要的邪恶。
保留我拥有的东西或回到绘图板上?
答案 0 :(得分:0)
如果您的问题是加载了您不需要的数据,则可以使用only method仅从数据库中检索所需的数据。
如果问题有点像这样:
您有一个模型总是有值,但它可能有几个不同的“配置文件”,可能会或可能不会填写。
我认为你处于良好的状态,我的意思是,另一种选择是让一切都null
能够,这不是很好,或者使用ForeignKeys,这会产生同样的查询。我唯一的注意事项是,只有当你正在使用的实体有意义时才应该使用模型继承,否则你可以使用OneToOne field(这只是概念上的,因为继承使用了一个OneToOne字段。罩)