Django应用程序似乎使用旧的QuerySet结果为基于date.today()过滤的新请求

时间:2012-11-17 19:30:14

标签: django caching django-queryset tastypie

我在nginx服务器上使用uWSGI进程提供的Django应用程序。此应用程序使用tastypie进行API管理,使用memcached缓存一些模板块。

我的问题是API请求会不断返回旧结果。

我按日期过滤我的查询

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

但返回的对象每天都是一样的。

我还将date.today添加到上下文中以进行调试,并正确输出当前日期。

当我重新启动uWSGI进程时,会正确评估QuerySet。

所以我从这个问题中排除了DB和memcached。对我来说,似乎某种QuerySet缓存是由tastypie或uWSGI进程完成的。

我已阅读tastypie caching documentation并尝试了NoCache课程但没有成功。

我也读过Django doc about QuerySet caching但是在每次请求后都不应该抛弃QuerySet对象吗?

更新

我检查了响应标头,客户端缓存在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

更新

我按照建议更改了我的查询

    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兼容。

2 个答案:

答案 0 :(得分:3)

您的QuerySet对象在Tastypie中不是请求范围的;它会在请求中持续存在。因此,您的date.today仅评估一次(即使您将date.today函数作为参数而不是其返回值传递),而不是像您期望的那样按请求传递。从Tastypie文档中查看this recipe以获得修复。

答案 1 :(得分:1)

尝试将此作为您的查询集值:

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