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

标签 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.

最佳答案

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

相关文章:

c++ - L 和 R 引用变量

C++ 将元素从一个 vector 移动到另一个 vector

Django - ImageField Blank=True 不起作用

python - 构建决策树

python - Print 打印一些额外的标志

python - 如何通过 scikit-learn 保存训练好的模型?

Django 。复杂的注释需要别名。这里的别名是什么?

mysql - 即使使用 utf8mb4_unicode_ci,在 django + mysql 中输入表情符号也会失败

c++ - 在类成员函数中获取引用并将其分配给 C++ 中的类数据成员(引用)

python - 返回 "self"?它到底做了什么,我们什么时候需要返回 self