2014-09-03 47 views
1

我很难理解如何在Django 1.6中使用modelManager。Django中的模型管理器 - 没有对模型类的引用?

我不明白让这段代码起作用的魔法在哪里。

在get_queryset(self)方法中,没有参考Book类,因此DahlBookManager如何知道它需要在执行super时使用Book实例(DahlBookManager,self)(对Book模型没有引用,据我所知,self指的是“DahlBookManager”类型的对象,而不是Book)。

因此,无论是有某种魔法,或者我真的需要审查我的Python 101.我很乐意有一些帮助,谢谢!

# First, define the Manager subclass. 
class DahlBookManager(models.Manager): 
    def get_queryset(self): 
     return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl') 

# Then hook it into the Book model explicitly. 
class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=50) 

    objects = models.Manager() # The default manager. 
    dahl_objects = DahlBookManager() # The Dahl-specific manager. 
+0

但你已经在'dahl_objects明确关联此经理,'Book' = DahlBookManager( )“对吗? – karthikr 2014-09-03 15:26:01

回答

3

当您创建在Django模型类,它在模型中的每个属性调用add_to_class

https://github.com/django/django/blob/1.6.5/django/db/models/base.py#L143

如果你想添加全班有contribute_to_class方法,那么它被调用,而不是调用setattr

https://github.com/django/django/blob/1.6.5/django/db/models/base.py#L264

所以,当您指定的经理模式类与

dahl_object = DahlBookManager() 

contribute_to_class()是c在接收模型类的经理类上进行操作。这样可以节省这对self.model:

https://github.com/django/django/blob/1.6/django/db/models/manager.py#L69

get_queryset()然后使用该参考self.model

https://github.com/django/django/blob/1.6/django/db/models/manager.py#L123

+0

非常感谢,我现在明白了它好多了,还是从哪里得到的,manager_to_class()是在经理类上调用的? 它仍然感觉像在引擎盖下的魔术:-) – cyberjoac 2014-09-03 16:52:22

+1

我已经更新了这篇文章,解释当把管理器附加到模型类时引擎盖下发生了什么。这有助于类方法是所有模型字段的工作方式,以便当您调用Foo.bar而不是获取字段本身的实例(这是您声明的)时,您将从数据库中获取值。 – 2014-09-04 07:48:20

相关问题