Django、多态性和N+;1查询问题

Django、多态性和N+;1查询问题,django,inheritance,orm,django-orm,Django,Inheritance,Orm,Django Orm,我正在用Django编写一个应用程序,我想在使用foreignkey时利用隐式继承。就我而言,处理这个问题的唯一方法是使用django\u多态库(django中没有单表继承,为什么?) 我想知道这个解决方案对性能的影响。在执行多态查询时执行什么类型的联接?与常规查询(臭名昭著的N+1查询问题)相比,它是否必须多次访问数据库?文档警告说“现代RDBMs无法有效处理执行的查询类型”?然而,它并不能真正说明这些查询是什么。任何统计数据、经验都会非常有用 编辑: 是否有任何方法可以检索对象列表,每个对象

我正在用Django编写一个应用程序,我想在使用foreignkey时利用隐式继承。就我而言,处理这个问题的唯一方法是使用
django\u多态库(django中没有单表继承,为什么?)

我想知道这个解决方案对性能的影响。在执行多态查询时执行什么类型的联接?与常规查询(臭名昭著的N+1查询问题)相比,它是否必须多次访问数据库?文档警告说“现代RDBMs无法有效处理执行的查询类型”?然而,它并不能真正说明这些查询是什么。任何统计数据、经验都会非常有用

编辑:


是否有任何方法可以检索对象列表,每个对象都是其实际类的一个实例,具有恒定数量的查询??我以为这就是前面提到的库所做的,但是现在我感到困惑,我不再那么确定了。

在Django中,继承的模型在内部通过
OneToOneField来表示。如果在查询中使用,Django将前后遵循一对一关系,以包含带有联接的引用表;因此,如果您使用的是
select\u related

好的,我进一步挖掘了一下,找到了这篇漂亮的文章:

所以很高兴这个图书馆做了一些合理的理智的事情。很高兴知道。

是Django多态性的替代品,Django多态性采用简单而干净的方法来解决单表继承问题。它使用添加到模型中的“type”属性。保存时,该类将持久化到“type”属性中。在查询时,该属性用于设置结果对象的类


它实现了您所期望的查询智能(从queryset返回的每个对象都是降级类),而不需要特殊语法或与Django多态相关的大量代码。没有额外的数据库查询。

好吧,但这里我想使用一个外部库,它试图为关系中的所有项返回实际类的实例。因此,我想象它在封面下对层次结构中的所有表执行一些额外的连接。这就是我所关心的。AFAIK django多态模型不使用
select_related()
,但在检索查询集时,您应该能够添加它,所以您不应该有任何额外的数据库调用……嗯。。。代码基于此代码段,似乎是:。不幸的是,它执行N+1查询,这在我的例子中是不可接受的。