我很难理解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.
答案 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