防止Django加入超类'表

时间:2012-10-21 00:22:22

标签: django optimization inheritance model django-queryset

拥有非抽象的父类:

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

但是在我的情况下,“dog”不是表,而是数据库中定义的复杂视图。该视图已包含“animal”中所有需要的字段,包括animal_ptr__id可访问的动物ID。

如何阻止django进行INNER JOIN,从而大大减慢查询速度?

2 个答案:

答案 0 :(得分:0)

我真的不明白为什么你认为dog在这种情况下不是表,因为你没有使用抽象基类。因此,multi-table inheritance并且每个子类 都有一个表。

据我所知,避免INNER JOIN多表继承的最佳方法是在abstract = True中设置class Meta来使用abstract base class。这似乎是你应该做的,但是......

但是,如果您坚持使用多表继承,则可以使用raw SQL queries。像这样的可能会工作:

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

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

答案 1 :(得分:0)

  

然而在我的情况下,“狗”不是一张桌子,而是一张复杂的视图   在数据库中定义。

您需要为Dog设置managed = False;否则你没有使用你的观点,而是一个名为app_dog的中间表(其中app是你的应用名称)。

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