假设我有一个类似下面的抽象基类:

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在抽象出差异方面做得很好,但是有时您还是反抗它们。

基本上,您必须在抽象继承之间进行选择,在这种情况下,两个类之间没有数据库关系,或者在多表继承之间进行选择,这使每个查询的数据库关系都以效率为代价(额外的数据库联接)。

09-27 17:00