2012-12-28 21 views
2

我正在运行Django 1.4.3和Python 2.7,带有PostgreSQL数据库(9.2.2)。我有一个带有“last_view”字段的模型,该字段是用户上次查看记录的时间戳。在我的头版我想显示在最近一周内的十个查看过的项目,所以在我的ListView我试图用这个对我的查询集:Django使用timezone.now和__range打破日期范围?

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属性将在数据库中更新 - 但如果我重新加载页面,则此项从“最近查看”列表(由上述查询集形成)中消失。

我认为这个问题与post有关,它似乎是timezone.now()的“enddate”在启动我的服务器进程时受到限制。所以当我在服务器运行后点击一个链接时,“当前时间”将在未来与“now()”相比并在范围之外(这就是为什么我点击的记录在页面重新加载时消失的原因)。但是,如果我改变的事情,只是现在在上述文章中,我得到的页面加载错误:

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

不支持的操作类型为 - :“功能”和“datetime.timedelta '

所以我不能创建我的startdate变量。我可以通过将查询集从_range更改为_gte来实现此目的,但是如果现在()真的被时间戳记到服务器进程启动而不是“当前时间”,那么它似乎会随时间而中断。

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

Django Tutorial on testing的确显示了日期进行查询使用现在,但是他们没有说明如何从减去天现在或timedelta或日期范围内使用它...

有人可以请解释如何从实际,当前时间,即使用现在而不是现在()?我还想更好地了解现在使用()与现在使用的限制。我找不到很好的文档,因为我可以用timedelta()找到的所有示例都引用timezone.now()或datetime.now(),它可以工作(不是我想要的方式)。

谢谢!

回答

5

子类ListView并重写get_queryset方法。通过计算get_queryset方法内的startdateenddatetimezone.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'), 
) 
+0

谢谢你的清晰,简明的答复!这解决了它 - 我没有意识到,urls.py只加载一次... – user