2015-07-20 150 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())