您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何找到Django模型基类的“具体类”

如何找到Django模型基类的“具体类”

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()方法将需要对每个项目进行一次查询

相反,如果您拥有一组已知的子模型,只需简单地分别查询每个模型并将实例聚合到一个列表中。

Go 2022/1/1 18:28:59 有504人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶