Django通过父模型表与子模型表之间的OneToOneField实现模型继承。当您这样做时Base.object.all()
,Django仅查询基本表,因此无法知道子表是什么。因此,不幸的是,没有其他查询就不可能直接进入子模型实例。
此代码段显示了将ContentType字段添加到基本模型的常用方法:
from django.contrib.contenttypes.models import ContentType
class Base(models.Model):
content_type = models.ForeignKey(ContentType,editable=False,null=True)
def save(self):
if(not self.content_type):
self.content_type = ContentType.objects.get_for_model(self.__class__)
self.save_base()
def as_leaf_class(self):
content_type = self.content_type
model = content_type.model_class()
if(model == Base):
return self
return model.objects.get(id=self.id)
然后可以说if Base.content_type.model_class()
确定类型。
如您所见,这两种解决方案都可能非常昂贵。如果您有大量实例,则使用as_leaf_class()方法将需要对每个项目进行一次查询。