2013-06-03 98 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中定義它。