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

cyb*_*oac 4 python django reference

我很难理解 Django 1.6 中 modelManager 的工作原理。

我不明白让这段代码工作的魔力在哪里。

在 get_queryset(self) 方法中,没有任何对 Book 类的引用,那么 DahlBookManager 为什么知道在执行 super(DahlBookManager, self) 时需要与 Book 实例一起工作(没有对 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.
Run Code Online (Sandbox Code Playgroud)

Stu*_*igh 6

当您在 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()
Run Code Online (Sandbox Code Playgroud)

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