Django应用程序似乎在基于date.today()筛选的新请求中使用旧的QuerySet结果

Django应用程序似乎在基于date.today()筛选的新请求中使用旧的QuerySet结果,django,caching,django-queryset,tastypie,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.

我在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进程时,查询集的计算结果正确。

所以我将DB和memcached排除在这个问题之外。在我看来,某种QuerySet缓存似乎是由tastypie或uWSGI进程完成的

我读过并尝试过NoCache课程,但没有成功

我也读过,但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\u begin
date\u end
以不同的方式格式化,以实现javascript兼容性。

尝试将此作为查询集值:

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

您的QuerySet对象在Tastypie中没有请求范围;它在请求之间持续存在。因此,date.today只计算一次(即使您将date.today函数作为参数而不是其返回值传递),而不是像您预期的那样按请求计算。查看Tastypie文档以了解修复方法。

解释:
date.today()
表示在首次导入类时(进程启动时)调用它。将其保留为
date。今天
意味着Django知道在求值时调用它。那么
events
queryset正在工作,因为
timedelta
有一个参数?