我无法在 Django 的 Manager 初始化方法中访问 QuerySet

I can't access QuerySet in Manager's init method in Django

我想在管理器的 __init__ 方法中获取模型的查询集,以便为查询集结果设置分页。我想在 __init__ 方法中设置分页的原因是因为我在管理器中有很多简单的方法,如 getPagegetNumberOfPages 等来简化抽象,我不想复制代码以在所有这些方法中设置 Paginator

例如,假设有一个 Article 模型,它有一个自定义的 ArticleManager,它看起来有点像这样:

class ArticleManager(models.Manager):
    def __init__(self):
        super(ArticleManager, self).__init__()
        allObjects = super(ArticleManager, self).get_queryset()
        self.articlePaginator = Paginator(allObjects, 10)


class Article(models.Model):
    # blah blah
    # Model fields everywhere
    objects = ArticleManager()

此代码的第四行 super(ArticleManager, self).get_queryset() returns AttributeError 异常:

AttributeError: 'NoneType' object has no attribute '_meta'

我想我应该做更多的事情来正确初始化管理器,但我不确定它是什么。我没有在 Django 文档或其他 Whosebug 问题中找到任何我想要的东西。另外我想我的方法可能有问题,所以如果是这种情况,如果有人指出这一点,我将不胜感激。

您正在调用父级的 get_query() 方法。您没有覆盖它,所以没有意义,只需在 self 上调用它。更好的是,让这个操作变得懒惰。属性是一个选项:

class ArticleManager(models.Manager):
    @property
    def article_paginator(self):
        return Paginator(self.get_queryset(), 10)

然后您可以通过Article.objects.article_paginator访问它。