2012-11-17 77 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