使用模型函数返回“注释”查询集

时间:2010-06-25 09:53:54

标签: python django

基本上我想做类似的事情,通过调用附加到响应的模型中的函数来注释查询集

目前我有类似的东西:

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

其中get_state()是调用外部Web服务的模型中的函数。我不想走下缓存价值观的道路。我只是希望有一种更简洁的方式来做这件事。

1 个答案:

答案 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属性的对象。因此,在这些情况下,这些方法在“绩效”方面或多或少相似。