2010-06-25 61 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屬性的對象。所以在這些情況下,這些方法在「性能」上或多或少是相似的。