2010-10-24 40 views
3

在我的userprofile模型中,我有一個方法(變成一個屬性),返回基於另一個模型的自定義管理器的查詢集。Django queryset自定義管理器 - 刷新緩存

具體來說,用戶可以銷售不易腐爛和易腐爛的物品,並且在物料模型級別上,包含邏輯(並返回查詢集)的幾個自定義管理器生存以確定物品是否已經消失。內USERPROFILE,方法生活,返回了類似於:

Item.live_objects.filter(seller=self.user), 

其中non_perished_objects是上述常規管理公司之一。

如果添加了一個項目,它永遠不會通過這些userprofile方法反映出來。只有在重新啓動服務器(以及正在重新填充查詢集緩存)時,結果纔是正確的。

有沒有辦法強制Django重新加載數據並刪除緩存的數據?

在此先感謝!

更新:

class LiveItemsManager(models.Manager): 

    kwargs = {'perished': False, 
       'schedule__start_date__lte': datetime.datetime.now(), 
       'schedule__end_date__gt': datetime.datetime.now()} 

    def get_query_set(self): 
     return super(LiveItemsManager, self).get_query_set().filter(**self.kwargs) 

class Item(models.Model): 
    live_objects = LiveItemsManager() 
    perished = models.BooleanField(default=False) 
    seller = models.ForeignKey(User) 

正如你看到的,也有一個時間表模型,包含起始日期,一個end_data和ITEM_ID場。

在用戶配置模式,我有:

def _get_live_items(self): 
    results = Item.live_objects.filter(seller=self.user) 
    return results 

live_items = property(_get_live_items) 

的問題是,調用live_items屬性時,返回的結果是隻緩存的結果。

(PS:不介意模型的建立;還有一個原因模型是它們是什麼:))

+0

您需要顯示更多代碼 - 整個方法以及調用它的管理器。 – 2010-10-24 21:25:08

回答

3

的問題是,首先定義管理器時,kwargs進行評估 - 這是什麼時候models.py是第一次導入。因此,對schedule__start_dateschedule__end_date使用的值是計算出來的,並且不會改變。您可以通過移動法內部的kwargs聲明解決這個問題:

def get_query_set(self): 
    kwargs = {'perished': False, 
       'schedule__start_date__lte': datetime.datetime.now(), 
       'schedule__end_date__gt': datetime.datetime.now()} 
    return super(LiveItemsManager, self).get_query_set().filter(**kwargs) 

(把定義爲__init__()不會幫助,因爲這將有同樣的效果:定義將在經理的實例進行評估,而不是定義,但由於管理員在定義模型時實例化,所以這幾乎是同一時間)。