我无法在 Django 的 Manager 初始化方法中访问 QuerySet
I can't access QuerySet in Manager's init method in Django
我想在管理器的 __init__
方法中获取模型的查询集,以便为查询集结果设置分页。我想在 __init__
方法中设置分页的原因是因为我在管理器中有很多简单的方法,如 getPage
和 getNumberOfPages
等来简化抽象,我不想复制代码以在所有这些方法中设置 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
访问它。
我想在管理器的 __init__
方法中获取模型的查询集,以便为查询集结果设置分页。我想在 __init__
方法中设置分页的原因是因为我在管理器中有很多简单的方法,如 getPage
和 getNumberOfPages
等来简化抽象,我不想复制代码以在所有这些方法中设置 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
访问它。