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() 不起作用的主要内容,如果未能解决你的问题,请参考以下文章