使用 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 将查询中的数据结果序列化为 json
如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段