拥有非抽象的父类:
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,从而大大减慢查询速度?
答案 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。