2010-06-25 73 views
0

基本上我想要做一些类似的操作,通过调用附加到响应的模型中的函数来注释查询集但是“使用模型函数注释”查询集返回

目前,我有这样的:

objs = WebSvc.objects.all().order_by('content_type', 'id') 
for o in objs: 
    o.state = o.cast().get_state() 

其中get_state()是在调用外部Web服务模型的功能。我不想走高速缓存价值观的道路。我只是希望有一个更简洁的方式来做到这一点。

回答

2

一种方式做到这一点,使用python性质:

class WebSvc(models.Model): 
    ... 

    def _get_state(): 
     return self.cast().get_state() 

    state = property(_get_state) 

优点:需要的属性时才会运行。

可能的缺点:当您多次调用属性时,Web服务将被重新调用(可能是必需的行为,但我怀疑它)。您可以使用记忆法进行缓存。

其他方式,只是做它通过覆盖INIT:

class WebSvc(models.Model): 
    ... 
    def __init__(*args, **kwargs): 
     super(WebSvc, self).__init__(*args,**kwargs) 
     self.state = self.caste().get_state() 

优点:不仅会而不需要记忆化来计算每个实例一次。

可能的缺点:将针对每个实例化对象进行计算。

然而,在大多数典型的Django案例中,您只能运行一次对象的属性,并且您可能不会实例化不会在其上使用.state属性的对象。所以在这些情况下,这些方法在“性能”上或多或少是相似的。