【问题标题】:Django custom manager get_queryset() not workingDjango 自定义管理器 get_queryset() 不起作用
【发布时间】: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()。

标签: python django python-2.7 django-models


【解决方案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 中看到很多类似的问题!大声笑:)
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2014-05-08
  • 2015-09-13
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
相关资源
最近更新 更多