Django显示前几天的数据

时间:2014-07-20 21:11:32

标签: python django postgresql

我的代码非常简单,它会查询数据库以获取未来事件的列表。

now = datetime.datetime.now(pytz.utc)

def index(request, listing='upcoming'):

    country_name = get_client_ip(request)

    if Location.objects.filter(country=country_name).count() == 0:
        global_scope = True
    else:
        global_scope = False

    if listing == 'upcoming':
        if global_scope == True:
            events = Event.objects.filter(date__gte=now, published=True)
        else:
            events = Event.objects.filter(date__gte=now, published=True, location__country=country_name)        

    elif listing == 'new':
        if global_scope == True:
            events = Event.objects.filter(published=True).order_by('-added')
        else:
            events = Event.objects.filter(published=True, location__country=country_name).order_by('-added')        

    elif listing == 'free':
        if global_scope:
            events = Event.objects.filter(date__gte=now, published=True, price__isnull=True)
        else:
            events = Event.objects.filter(date__gte=now, published=True, price__isnull=True, location__country=country_name)        

    elif listing == 'wishlist':
        events = Event.objects.filter(users = request.user.id, published=True)
    else:
        events = Event.objects.filter(date__gte=now, published=True)

    paginator = Paginator(events, 10)

    page = request.GET.get('page')
    try:
        events = paginator.page(page)
    except PageNotAnInteger:
        events = paginator.page(1)
    except EmptyPage:
        events = paginator.page(paginator.num_pages)

    return render(request, 'events/index.html', { "events": events, 'listing': listing, 'country_name': country_name, })

这里的问题是,由于某种原因,该网站会在星期一开始显示事件,直到我在星期五用一些事件更新数据库。

该网站在postgres上运行,并使用django 1.6。我查了一下,看起来好像在设置 default_transaction_isolation:' read committed'会解决它。但是阅读postgres的文档我发现它是默认的。

关于如何跟踪造成这种情况的原因的任何想法?

1 个答案:

答案 0 :(得分:0)

因此,出于某种原因,now的定义在函数之外,在模块级别。这意味着它只在进程启动时执行,并且相同的值将用于该进程中的所有请求。您的Web服务器管理其流程,它们可以持续数天或数周才能被回收。

只需将该行移动到函数本身,每次调用函数时它都会得到一个新值。

(如果要定义 在请求中是静态的数据,则定义函数外部的值是一种非常好的技术,但这不是这种情况。)