2015-07-20 109 views
2

通过Django Rest Framework API,我试图在将来为所有对象提供日期时间。Django:timezone.now()不返回当前日期时间

问题是,一旦服务器启动,每当我提交查询时,API将服务所有对象的日期时间大于服务器启动的日期时间,而不是日期时间大于当前时间。

from django.utils import timezone 

class BananasViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Banana.objects.filter(date_and_time__gte=timezone.now()) 
    ... 

没有任何更多的运气,我也试过这种变化:

import datetime as dt 

class BananasViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Banana.objects.filter(date_and_time__gte= 
     timezone.make_aware(dt.datetime.now(), timezone.get_current_timezone()) 
    ... 

制作在Django壳类似的查询返回正确的对象是最新的......

+0

那么,你的意思是'timezone.now()'应该返回当前时间而不是服务器启动的时间? –

+0

确实我认为'timezone.now()'应该返回当前时间。这就是它在shell中所做的。 –

回答

7

由于应用程序代码当前写你正在运行timezone.now()一旦被创建,上课的时候首先从任何地方进口。

而不是在类属性本身上应用时间查询集筛选,请在get_queryset()方法中执行此操作,以便在每次传递时都会重新评估它。

例如,

class BananasViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Banana.objects.all() 

    def get_queryset(self): 
     cutoff = timezone.now() 
     return self.queryset.filter(date_and_time__gte=cutoff) 
+0

最好使用带'USE_TZ = True'的'timezone.now()'而不是'make_aware(datetime.now(),get_current_timezone())'。如果当前时区与默认时区不同,则后者是错误的,即使在DST转换期间它可能会失败。 – jfs

+0

已注意。我想我只是复制开放式问题的风格,但我现在已经更新了答案。 –

3
timezone.now() 

该函数返回当前时间。它不会返回服务器启动的时间。所以根据你的查询,你要求在香蕉模型上的过滤器date_and_time字段大于当前时间。

这实际上查询似乎不妥,因为没有对象可以同时在date_and_time字段大于或等于timezone.now()

+0

在我的例子中,香蕉是事件,我只想展示未来的事件。这与创建对象的时间无关。 –

0

会不会像这样能够更好地放入一个构造函数,因此你可以预测timezone.now()实际上是叫什么名字?

from django.utils import timezone 

class BananasViewSet(viewsets.ReadOnlyModelViewSet): 

    def __init__(self,*args,**kwargs): 
     super(BananasViewSet,self).__init__(*args,**kwargs) 
     self.queryset = Banana.objects.filter(date_and_time__gte=timezone.now()) 
相关问题