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

9
例如,我有以下模型:
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个回答

2

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

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


很遗憾,这对我不起作用!您链接中的文档说明:在查询相关模型时不使用基本管理器。有什么想法? - Henhuy
如果您的情况类似于问题中的情况,您只需使用以下代码:ModelC.objects.select_related('z__y').first().z.y - hugobessa
4
不,对我来说并不那么简单。在我的自定义管理器中,我向原始查询集添加了多个注释。现在,我想通过外部模型的select_related()保留这些注释......不想再次添加注释(保持DRY)。 - Henhuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接