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)
当您在 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