2012-11-17 110 views
3

新的請求我有一個Django應用程序服務於uWSGI進程在nginx服務器上。此應用程序使用tastypie進行API管理,並使用memcached緩存一些模板塊。Django應用程序似乎使用舊的QuerySet結果基於date.today()篩選

我的問題是API請求不斷返回舊結果。

我按日期

queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today()).order_by('-featured', 'date_end') 

過濾我的查詢,但返回的對象是每天都一樣。

爲了調試的目的,我還爲date.today添加了date.today,它正確輸出當前日期。

當我重新啓動uWSGI進程時,QuerySet被正確評估。

所以我排除DB和memcached這個問題。對我來說,似乎某種QuerySet緩存是由tastypie或uWSGI進程完成的。

我讀過tastypie caching documentation,試過NoCache類沒有成功。

我也讀過Django doc about QuerySet caching但不是每個請求後應該拋出QuerySet對象?

UPDATE

我檢查響應頭和客戶端緩存60秒一小時的最大年齡後過期。

HTTP/1.1 200 OK 
Server: nginx/1.2.6 
Date: Mon, 18 Feb 2013 10:47:03 GMT 
Content-Type: application/json; charset=utf-8 
Connection: keep-alive 
Last-Modified: Mon, 18 Feb 2013 10:44:56 GMT 
Expires: Mon, 18 Feb 2013 10:54:56 GMT 
Cache-Control: max-age=600 

UPDATE

我改變了我的查詢作爲建議

queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today).order_by('-featured', 'date_end') 

但結果還是一樣。

這裏是一個JSON輸出示例

{ 
    "date_begin": "11/17/2012", 
    "date_end": "11/17/2012", 
    "description": "Presentazione del libro di Daniela Giusto", 
    "featured": false, 
    "location": "Libreria antiquaria Romeo Prampolini", 
    "resource_uri": "/api/v1/event/213/", 
    "time": "18:00:00", 
    "title": "Un insolito Jules Verne. Tradurre umorismo e fantasia", 
    "today": "2012-11-18", 
} 

date_begindate_end在爲JavaScript兼容性以不同的方式被格式化。

回答

3

你QuerySet對象不是請求範圍在Tastypie;它堅持跨請求。因此,您的date.today僅被評估一次(即使您將date.today函數作爲參數而不是其返回值),而不是按照您的預期的每個請求。查看Tastypie文檔中的this recipe以獲得修復。

+0

你是我的英雄! – Luca

1

試試這個作爲你的查詢集值:

queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today) 
+1

解釋:'date.today()'意味着它在第一次導入類時(在進程啓動時)被調用。將它留作'date.today'意味着Django知道在評估時稱它爲「。 –

+0

所以'events' queryset正在工作,因爲'timedelta'有一個參數? – Luca

+0

同樣的問題,它不起作用。 – Luca