2013-06-03 63 views
0

我已经构建了一个Django站点来列出当前和即将发生的服务中断。查询不刷新,除非我重新启动Apache服务。它会抓住我添加的新消息,但存在不一致。Django查询不刷新

我在下面运行它。

  • Apache 2.2的
  • 的Postgres 9.2
  • 的Django 1.5.1
  • 的Windows 2008

的看法是

class MessageViewMixin(object): 

    queryset = Message.objects.filter(message_type__id=1 
       ).filter(inactive=False 
       ).filter(start_time__range=(now, nextweek) 
       ).order_by('-start_time', '-end_time') 
    context_object_name = 'upcoming_list' 

    def get_context_data(self, **kwargs): 
     context = super(MessageViewMixin, self).get_context_data(**kwargs) 
     context['current_list'] = Message.objects.filter(
          inactive=False 
         ).filter(
          Q(message_type__id=1) | Q(message_type__id=2) 
         ).filter(
          Q(end_time__isnull=True) | Q(end_time__gte=now) 
         ).filter(start_time__lte=now 
         ).order_by('-start_time', '-end_time') 
    return context 

所以upcoming_list是在中断查询未来一周。当中断发生时,该消息现在应该落在current_list之下。除非我重新启动Apache,否则这不会发生。

+1

它可能是由于'context_object_name ='cominging_list''的缓存 - 尝试删除该 – karthikr

+0

这似乎已经做到了。我不明白为什么更改上下文名称会导致缓存问题。我现在正在阅读文档以尝试理解。 – Ross

+0

我想这是这样的:'context_object_name'就像是上下文中的一个关键字,因为对象在后续请求中不会发生变化,所以假设没有任何变化,并且缓存不会失效,所以它最终会给出每次都从缓存中得到相同的结果集 – karthikr

回答

0

你描述的行为正是你应该期望的。你把你的查询放在类定义中。立即进行评估并分配给变量queryset

相反,覆盖get_queryset被称为每次..

def get_queryset(self): 
    return Message.objects.filter(message_type__id=1 
       ).filter(inactive=False 
       ).filter(start_time__range=(now, nextweek) 
       ).order_by('-start_time', '-end_time') 
1

我的博客上讲述这个问题here

总结那篇文章,尽管查询集确实是懒惰的,只有在调用视图时才被评估,但now的定义不是。正如Tomita所说,答案是在get_queryset中定义它。