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

标签 django inheritance orm django-orm

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

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

编辑:

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

最佳答案

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

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

关于Django,多态和N+1查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5612110/

相关文章:

python - 不涉及request.POST.getlist的Django admin中间页面_selected_action的正确设置方法是什么?

python - 如何设置 session 在 4 分钟内过期?

python - Django QuerySet values_list 返回未知字符

java - 如何编写此 JPQL 查询?

database - Django - 是否可以删除 Django 生成的数据库索引?

java - 从子对象调用的私有(private)方法

c++ - 继承不同类型的 vector 类

Java - 具有相同方法的不同对象的数组

php - Laravel Eloquent with() 方法适用于 'where' 但不适用于 'Model::find()'

javascript - Sequelize : Changing the nested data structure