【发布时间】:2021-04-20 04:59:30
【问题描述】:
假设我有三个相关的类,例如:
class A:
...
class B:
...
a = models.ForeignKey(A, ...)
class C:
...
b = models.ForeignKey(B, ...)
我想自定义访问C 对象上的b 以立即加载a。这意味着每当我打电话给c.b 一个select_related 查询电话a 。还有其他场景我需要能够使用prefetch_related。
我正在使用django 3.1.1
【问题讨论】:
-
您可以尝试使用自定义管理器并通过设置
_base_manager将其设置为基本管理器。见Base managers (Django docs)。 (基本管理器是用于访问相关对象的管理器) -
同一个类在不同外键中使用时是否可以定义不同的
base_manager? -
一个模型只有一个基地经理,你上面的意思是什么?你的意思是你想根据使用的 fk 在不同的模型上执行
select_related吗?无论如何,您的用例真的很奇怪。为什么不直接在需要时直接在C上使用select_related。 -
C已在其他模型中使用过,我不想为所有模型定义Manager以加载C也强制所有模型加载C的参数。此外,C中的b也不会一直使用。我理解您所说的简单调用select_related的意思,但我认为在我所说的情况下,这不是一个可行的解决方案,base_manager可能是一个不错的选择。 -
如果不是很清楚你会在这里为
B做一个基础经理。每当任何模型需要访问其相关的B实例时,他们都会使用它的基本管理器。所以它不是C模型的基础管理器。此外,如果您担心总是加载相关模型,则基本管理器和默认管理器可能会有所不同。
标签: django django-models django-orm