所以,我读了大部分的文件,我也到处找了这么多,但我找不到我问题的答案。我先从密码开始。在
# Manager
class ActiveManager(models.Manager):
def get_query_set(self):
return super(ActiveManager, self).get_query_set().filter(is_active=True)
^{pr2}$
所以,当我在玩的时候,我注意到如果我这样写它并使用get_object_or_404()
,那么它将使用ActiveManager
首先搜索所有活动记录,然后返回与我的查询相关的记录。但是,如果我改变了经理的顺序:
class ModelA(models.Model):
# ...
all_objects = models.Manager()
objects = ActiveManager()
然后它使用默认管理器(在本例中是all_objects
)来执行查询。我想知道这种变化会影响到其他什么功能。在
EDIT:我知道类中找到的第一个管理器成为默认管理器,但是我想知道哪些特定函数使用这个默认管理器(比如get_object_or_404
)
以下是文档中的相关部分:"If you use custom ^{} objects, take note that the first ^{} Django encounters (in the order in which they're defined in the model) has a special status. Django interprets the first ^{} defined in a class as the "default" ^{}, and several parts of Django (including ^{}) will use that ^{} exclusively for that model. As a result, it's a good idea to be careful in your choice of default manager in order to avoid a situation where overriding ^{} results in an inability to retrieve objects you'd like to work with" 。在
如果您看一下the way ^{} is implemented ,它们使用模型的
_default_manager
属性,这就是Django如何引用遇到的第一个管理器。(据我所知,所有Django内部结构都是这样工作的,它们从不使用Model.objects
等,因为您不应该假设默认的管理器恰好被称为objects
)。在它影响很多事情。管理器的默认名称
objects
,只是一个默认名称,但不是必需的。如果您没有在模型定义中包含objects
,而只是将一个管理器定义为all_objects
,ModelA.objects
就不存在了。如果模型中没有其他管理器,并且您还没有自己定义objects
,那么Django只会为它分配一个默认的管理器。在无论如何,由于这个原因,Django获取模型中定义的第一个管理器并将其称为“default”,然后在需要引用模型管理器的任何时候使用“default”管理器(因为它不能简单地使用
objects
,因为objects
可能没有定义)。在经验法则是Django应该使用的标准管理器(从某种意义上说,应该是最通常使用的管理器)应该是第一个定义的管理器,不管它是被分配给
objects
还是完全其他的东西。其他的经理都应该在那之后。在相关问题 更多 >
编程相关推荐