当使用select_related时,我怎么能使用相关模型的自定义管理器?

时间:2018-03-18 21:18:14

标签: django django-models django-rest-framework django-queryset django-managers

例如,我有模型,

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,我会使用预取的ModelB实例(ModelA实例)获取ModelBManager实例。

但如果我ModelC.objects.select_related('z')[0].z,则ModelA实例将没有预取ModelB实例。(基本上ModelBManager无效!)

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

由于

1 个答案:

答案 0 :(得分:1)

模型的默认管理器不会自动用于相关字段。相反,您必须覆盖base_manager。有一个用于设置模型基础base_manager_name的元选项,您可以看到here

要查看base_manager的工作原理,您可以查看here

警告: Django警告用户避免覆盖base_managers中的get_queryset方法。你可以看到它here