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

r4v*_*4v1 5 django django-models django-queryset django-managers django-rest-framework

例如,我有模型,

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)
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做,ModelC.objects.get(id=1).z我将获得ModelB带有预取ModelA实例(ModelBManager工作)的实例。

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

任何人都知道我该如何实现这一目标?

谢谢

hug*_*ssa 2

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

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

  • 不,这对我来说没那么简单。在我的自定义管理器中,我向原始查询集添加了多个注释。现在,我想通过外部模型通过 select_lated() 保留这些注释...不想再在那里添加注释(DRY)... (4认同)