Django 自定义管理器 get_queryset() 不起作用

Posted

技术标签:

【中文标题】Django 自定义管理器 get_queryset() 不起作用【英文标题】:Django custom manager get_queryset() not working 【发布时间】:2013-05-04 07:55:20 【问题描述】:

我无法让我的自定义管理器工作...

class PublicArtigoManager(models.Manager):
    def get_queryset(self):
        return super(PublicArtigoManager, self).get_queryset().filter(data_publicacao__lte=timezone.now()).filter(permissao__lte=3)

class Artigo(models.Model):
    ...
    objects = models.Manager()
    publics = PublicArtigoManager()

当我在 shell 中测试时,它不起作用

>>> from artigos.models import Artigo
>>> from django.utils import timezone
>>> print Artigo.objects.count()
9960
>>> print Artigo.publics.count()
9960
>>> print Artigo.objects.filter(data_publicacao__lte=timezone.now()).filter(permissao__lte=3).count()
9959

Artigo.publics.count() 应该返回 9959,对吗?有什么想法可能出了什么问题?

【问题讨论】:

你用的是什么版本的 django?曾经是 get_query_set 。除此之外,我不知道。 是的,我在文档中看到了,但我使用的是 1.5.0 >>> django.VERSION (1, 5, 0, 'final', 0) 时区问题?尝试在管理器和交互式控制台中检查timezone.now() 【参考方案1】:

我确定问题出在get_query_set 方法上。 This is the doc for version 1.5 经理,上面写着:

您可以通过覆盖 Manager.get_query_set() 方法来覆盖 Manager 的基本 QuerySet。 get_query_set() 应该返回一个带有您需要的属性的 QuerySet。

尝试使用get_query_set 而不是get_queryset 来实现,这在dev doc 中是这样解释的:

您可以通过覆盖 Manager.get_queryset() 方法来覆盖 Manager 的基本 QuerySet。 get_queryset() 应该返回一个带有您需要的属性的 QuerySet。

如果您想 100% 肯定方法在您的版本中是如何命名的,只需转到 django/db/models/manager.py 中的 Manager 类定义并搜索类中方法的命名方式。

希望对你有帮助!

【讨论】:

虽然我不喜欢这个改动。这是 Django 中的一个重大变化,更糟糕的是,它默默地失败了。如果这种情况持续下去,我们将在 SO 中看到很多类似的问题!大声笑:)

以上是关于Django 自定义管理器 get_queryset() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django中模型

在已过滤的查询集上使用 Django 自定义管理器功能

如何覆盖自定义管理器类中的 .update() 方法

Python 3 Django Rest Framework - 如何向这个 M-1-M 模型结构添加自定义管理器?

芹菜任务和自定义装饰器

Django自定义Auth模块方式