基本上我想做类似的事情,通过调用附加到响应的模型中的函数来注释查询集但。
目前我有类似的东西:
objs = WebSvc.objects.all().order_by('content_type', 'id')
for o in objs:
o.state = o.cast().get_state()
其中get_state()
是调用外部Web服务的模型中的函数。我不想走下缓存价值观的道路。我只是希望有一种更简洁的方式来做这件事。
答案 0 :(得分:2)
使用python属性的一种方法:
class WebSvc(models.Model):
...
def _get_state():
return self.cast().get_state()
state = property(_get_state)
优点:仅在需要属性时运行。
可能的缺点:当您多次调用该属性时,将重新调用Web服务(可能是必需的行为,但我对此表示怀疑)。您可以使用memoization进行缓存。
其他方式,只需覆盖init:
即可class WebSvc(models.Model):
...
def __init__(*args, **kwargs):
super(WebSvc, self).__init__(*args,**kwargs)
self.state = self.caste().get_state()
优点:每个实例只需计算一次,无需进行记忆。
可能的缺点:将为每个实例化对象计算。
然而,在大多数典型的django情况下,您只能在对象的属性上运行一次,并且您可能无法实例化不使用.state属性的对象。因此,在这些情况下,这些方法在“绩效”方面或多或少相似。