2010-10-24 46 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__()不会帮助,因为这将有同样的效果:定义将在经理的实例进行评估,而不是定义,但由于管理员在定义模型时实例化,所以这几乎是同一时间)。