Django中的模型管理器 - 没有引用模型类?

时间:2014-09-03 15:18:52

标签: python django reference

我很难理解Django 1.6中的modelManager是如何工作的。

我不明白使这段代码有效的神奇之处。

在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.

1 个答案:

答案 0 :(得分: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(),它接收模型类。它将此保存在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