2011-07-26 87 views
1

所以,我已经阅读了大部分的文档,并且我一直在环视这个问题,但是我无法完全找到我的问题的答案。我将从代码开始。Django Managers的顺序会影响哪些功能?

# Manager 
class ActiveManager(models.Manager): 
    def get_query_set(self): 
     return super(ActiveManager, self).get_query_set().filter(is_active=True) 
# Model 
class ModelA(models.Model): 
    # ... 
    is_active = models.BooleanField() 
    objects = ActiveManager() 
    all_objects = models.Manager() 

所以,我打转转,而我注意到,如果我写的这种方式和使用get_object_or_404(),那么它将使用ActiveManager先搜索所有活动记录,然后返回一个有关我的查询。但是,如果我换了经理的顺序:

class ModelA(models.Model): 
    # ... 
    all_objects = models.Manager() 
    objects = ActiveManager() 

然后,它使用默认的经理,在这种情况下all_objects,做查询。我想知道这种变化会对其他功能产生什么影响。

编辑:据我所知,第一个经理发现,在类成为默认的经理,但我不知道具体的功能使用默认的管理器,它(如get_object_or_404

回答

2
+0

是啊,我读了,但我不知道它具体的东西会用_default_manager这样我就可以看出来他们。最常见的可能足够好 –

+0

@Bryce Siedschlaw,我发现Django引用模型的'objects'属性的代码中的唯一位置(即,动态传递的 - 当然他们使用'User .objects','Site.objects'等)是[here](https://code.djangoproject.com/browser/django/trunk/django/views/generic/create_update.py#L78)(但是基于函数的通用视图反正也被弃用)。特别是,通用视图默认使用'_default_manager'。 –

+0

你不会偶然知道任何使用_default_manager的特定常用函数吗?像'get_object_or_404'一样。 –

0

它影响很多事情。经理objects的默认名称就是默认名称,但不是必需的。如果您在模型定义中没有包含objects,并且只将经理定义为all_objects,则ModelA.objects不存在。如果模型中没有其他经理出现,Django只会为其分配一个默认经理,而您自己并没有定义objects

不管怎么说,因为这个Django需要在模型中定义第一个管理器并调用“default”,并随后使用“default”管理器需要引用模型的管理器(因为它可以' t只需使用objects,因为objects可能未定义)。

经验法则是,Django应该使用的标准管理器(从某种意义上讲,应该是最常用的管理器)应该是第一个定义的,无论它是完全分配给objects还是别的。在此之后,其他所有经理都应该出现。

+0

就像我告诉isbadawi,我已经阅读了文档的这些部分,并理解了所有这些。我只是想知道哪些特定的函数使用模型的默认管理器(如'get_object_or_404')。这样我可以追踪他们,并确保他们正在做我想做的事。这是我没有在问题中指定的错。 –

+0

我认为我们都在做的一点是它是一切。 Django从不直接调用'objects'。因此,任何执行查找的方法都将使用默认管理器,无论如何。 –

相关问题