【问题标题】:Model Manager in Django - No reference to model class?Django 中的模型管理器 - 没有对模型类的引用?
【发布时间】:2014-09-03 15:18:51
【问题描述】:

我很难理解模型管理器在 Django 1.6 中的工作原理。

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

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

【问题讨论】:

  • 但是你已经在dahl_objects = DahlBookManager() 中将这个经理专门关联到Book 对吧?

标签: python django reference


【解决方案1】:

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

【讨论】:

  • 非常感谢,我现在明白了很多,但你从哪里得到在管理器类上调用了contribute_to_class()?感觉就像在引擎盖下发生了魔法:-)
  • 我已经更新了这篇文章,以解释当您将管理器附加到模型类时发生了什么。这有助于类方法是所有模型字段的工作方式,因此当您调用 Foo.bar 而不是获取字段本身的实例(这是您声明的)时,您会从数据库中获取值。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2010-11-25
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多