我很难理解 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.
最佳答案
当您在 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
关于python - Django 中的模型管理器 - 没有引用模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648040/