0

有一个非抽象的父类:

class Animal(models.Model)

和两个子类:

class Cow(Animal)
class Dog(Animal)

并打电话

Dog.objects.order_by('name') 

查询数据库并返回连接记录:

SELECT ... FROM dog 
INNER JOIN animal ON (dog.animal_ptr_id = animal.id) 
ORDER BY dog.name ASC

但是在我的情况下,“狗”不是表,而是数据库中定义的复杂视图。该视图已经包含来自“animal”的所有必需字段,包括由 animal_ptr__id 访问的动物 id。

如何防止 django 进行 INNER JOIN 大大减慢查询速度?

4

2 回答 2

0

我真的不明白为什么您认为dog在这种情况下不是表格,因为您没有使用抽象基类。因此它多表继承,每个子类都有一个表。

INNER JOIN据我所知,避免多表继承的最佳方法是通过设置in来使用抽象基类。看起来这是你应该做的,但是..abstract = Trueclass Meta

但是,如果您坚持使用多表继承,则可以使用原始 SQL 查询。像这样的东西可能会起作用:

Dog.objects.raw('SELECT ... FROM myapp_dog ORDER BY dog.name ASC')

虽然dog单独的 table 不会包含它从基类继承的属性Animal。为了获得那些继承的属性,我认为 aJOIN是不可避免的,除非我错过了一些明显的东西。

于 2012-10-21T07:43:10.597 回答
0

但是在我的情况下,“狗”不是表,而是数据库中定义的复杂视图。

您需要设置managed = FalseDog; 否则你没有使用你的视图,而是一个名为的中间表app_dogapp你的应用程序名称在哪里)。

这可以防止 django 创建表但使用内部定义的表(在您的情况下为视图)。确保您还指定了一个,并指定了表名

于 2012-10-21T08:14:43.740 回答