使用 select_related 时,如何使用相关模型的自定义管理器?

Posted

技术标签:

【中文标题】使用 select_related 时,如何使用相关模型的自定义管理器?【英文标题】:How could i use custom manager of the related model, when using select_related? 【发布时间】:2018-08-27 10:03:03 【问题描述】:

例如,我有模型,

class ModelBManager(models.Manager):
    def get_queryset(self):
        return self.super().get_queryset().select_related('y')

class ModelA(models.Model):
    x = models.TextField()

class ModelB(models.Model):
    y = models.ForeignKey(ModelA)
    objects = ModelBManager()

class ModelC(models.Model):
    z = models.ForeignKey(ModelB)

现在,如果我执行ModelC.objects.get(id=1).z,我将获得带有预取ModelA 实例的ModelB 实例(ModelBManager 有效)。

但如果我使用ModelC.objects.select_related('z')[0].z,则不会有预取的ModelA 实例和ModelB 实例。(基本上ModelBManager 不起作用!)

有人知道我该如何实现吗?

谢谢

【问题讨论】:

【参考方案1】:

select_related 允许使用 span 获取更深层次的关系。

在你的情况下,你应该使用ModelC.objects.select_related('z__y').first().z.y

【讨论】:

不幸的是,这对我不起作用!您链接中的文档指出:查询相关模型时不使用基础管理器。有什么想法? 如果您的情况与问题中的情况相似,您可以ModelC.objects.select_related('z__y').first().z.y 不,对我来说没那么简单。在我的自定义管理器中,我向原始查询集添加了多个注释。现在,我想通过外国模型通过 select_related() 保留这些注释......不想再在那里添加注释(DRY)......

以上是关于使用 select_related 时,如何使用相关模型的自定义管理器?的主要内容,如果未能解决你的问题,请参考以下文章

82.常用的返回QuerySet对象的方法使用详解:all,select_related

如何使用 select_related

使用 select_related 将查询中的数据结果序列化为 json

如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段

如何使用 select_related 获取 ManyToMany 字段值

如何在模板 Django 中使用 select_related?