2014-09-03 44 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

相關問題