假设我有一个类似下面的抽象基类:
class StellarObject(BaseModel):
title = models.CharField(max_length=255)
description = models.TextField()
slug = models.SlugField(blank=True, null=True)
class Meta:
abstract = True
现在,假设我有两个实际的数据库类,它们继承自StellarObject
class Planet(StellarObject):
type = models.CharField(max_length=50)
size = models.IntegerField(max_length=10)
class Star(StellarObject):
mass = models.IntegerField(max_length=10)
到现在为止还挺好。如果我想获得行星或恒星,我要做的就是:
Thing.objects.all() #or
Thing.objects.filter() #or count(), etc...
但是,如果我想获得所有StellarObjects怎么办?如果我做:
StellarObject.objects.all()
它当然会返回错误,因为抽象类不是实际的数据库对象,因此无法查询。我读过的所有内容都说我需要做两个查询,分别针对“行星”和“恒星”,然后将它们合并。这似乎效率极低。那是唯一的方法吗?
最佳答案
从根本上讲,这是对象和关系数据库之间不匹配的一部分。 ORM在抽象出差异方面做得很好,但是有时您还是反抗它们。
基本上,您必须在抽象继承之间进行选择,在这种情况下,两个类之间没有数据库关系,或者在多表继承之间进行选择,这使每个查询的数据库关系都以效率为代价(额外的数据库联接)。