我无法在Django的Manager的init方法中访问QuerySet

时间:2016-05-28 20:15:09

标签: python django django-models django-queryset

我想在Manager的__init__方法中获取Model的QuerySet,以便为QuerySet结果设置Pagination。我想在__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()会返回AttributeError例外:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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