Django,多态和N + 1查询问题

时间:2011-04-10 13:41:37

标签: django inheritance orm django-orm

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

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

修改

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

3 个答案:

答案 0 :(得分:2)

Django-Typed-Models是Django-Polymorphic的替代方案,它简单而简单。干净的方法来解决单表继承问题。它可以处理添加到模型中的“类型”属性。保存时,该类将保留在“type”属性中。在查询时,该属性用于设置结果对象的类。

它可以执行您期望的查询(从查询集返回的每个对象都是下载类),而无需特殊语法或与Django-Polymorphic相关的可怕代码量。并且没有额外的数据库查询。

答案 1 :(得分:1)

在Django中,继承的模型通过OneToOneField在内部表示。如果您在查询中使用select_related(),Django将遵循前向和后向的一对一关系,以包含带有连接的引用表;因此,如果您使用select_related,则不需要两次点击数据库。

答案 2 :(得分:1)

好的,我进一步深入挖掘并找到了这段不错的文章:

https://github.com/bconstantin/django_polymorphic/blob/master/DOCS.rst#performance-considerations

很高兴这个图书馆做了一些合理的理解。很高兴知道。