3

我正在使用 PostgreSQL 数据库 (9.2.2) 运行 Django 1.4.3 和 Python 2.7。我有一个带有“last_view”字段的模型,该字段是用户最后一次查看记录的时间戳。在我的首页上,我想显示上周查看次数最多的十个项目,因此在我的 ListView 中,我尝试将其用于我的查询集:

startdate = timezone.now() - datetime.timedelta(days=7)
enddate = timezone.now()
urlpatterns = patterns('',
    url(r'^$',
        ListView.as_view(
            queryset=Tag.objects.filter(last_view__range=([startdate, enddate])).order_by('-views')[:10],
            context_object_name='most_viewed_list',
            template_name='tags/index.html'),
        name='index'),

这在我第一次加载页面时有效。如果我单击任何记录并“查看”它们,则数据库中的 last_view 属性会更新——但如果我随后重新加载页面,则该项目将从“最近查看”列表中消失(由上述查询集形成)。

我认为问题与这篇文章有关,似乎 timezone.now() 的“结束日期”受我启动服务器进程的时间限制。因此,当我在服务器运行后单击链接时,与“now()”相比,“当前时间”在未来并且超出范围(这就是我单击的记录在页面重新加载时消失的原因)。但是,如果我像上面提到的帖子中那样将内容更改为现在,我会在页面加载时收到错误消息:

startdate = timezone.now - datetime.timedelta(days=7)
enddate = timezone.now

- 不支持的操作数类型:“function”和“datetime.timedelta”

所以我无法创建我的 startdate 变量。我可以通过将我的查询集从 _range 更改为 _gte 来使其工作,但如果now()的时间戳确实是服务器进程启动的时间而不是“当前时间” ,那么它似乎会随着时间的推移而中断。

queryset=Tag.objects.filter(last_view__gte=(timezone.now() - datetime.timedelta(days=7)).order_by('-views')[:10]

关于测试的Django 教程确实显示了now在对日期进行查询时的用法,但是它们没有显示如何从现在减去天数或将其与 timedelta 或日期范围一起使用...

有人可以解释一下如何从实际的当前时间获取时间差,即使用now而不是now()吗?我还想更好地了解使用now()now的局限性。我找不到很好的文档,因为我可以使用 timedelta() 找到的所有示例都引用 timezone.now() 或 datetime.now(),它们有效(只是不是我想要的方式)。

谢谢!

4

1 回答 1

7

子类ListView化并覆盖该get_queryset方法。通过计算方法内部的startdateand ,将是发出请求的时间,而不是最初加载的时间。enddateget_querysettimezone.now()urls.py

class TagListView(ListView):
    def get_queryset(self):
        startdate = timezone.now() - datetime.timedelta(days=7)
        enddate = timezone.now()
        return Tag.objects.filter(last_view__range=[startdate, enddate]).order_by('-views')[:10]
    context_object_name='most_viewed_list'
    template_name='tags/index.html'

urlpatterns = patterns('',
    url(r'^$', TagListView.as_view(), name='index'),
)
于 2012-12-29T03:44:27.417 回答