我正在使用 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(),它们有效(只是不是我想要的方式)。
谢谢!