«Аннотирующие» наборы запросов с возвращением модельной функции - PullRequest
0 голосов
/ 25 июня 2010

В основном я хочу сделать что-то похожее на аннотирование набора запросов , но с вызовом функции в модели, прикрепленной к ответу.

В настоящее время у меня есть что-то вроде:

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

, где get_state() - это функция в модели, которая вызывает внешний веб-сервис.Я не хочу идти по пути кеширования ценностей.Я просто надеялся на более лаконичный способ сделать это.

1 Ответ

2 голосов
/ 25 июня 2010

Один из способов сделать это, используя свойства python:

class WebSvc(models.Model):
    ...

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

    state = property(_get_state)

Преимущества: запускается только тогда, когда требуется свойство.

Возможный недостаток: при многократном вызове свойства веб-служба будет вызываться заново (может потребоваться поведение, но я сомневаюсь в этом). Вы можете кэшировать, используя памятку.

Другой способ, просто сделайте это, переопределив init:

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

Преимущества: будет вычисляться только один раз за экземпляр без необходимости запоминания.

Возможный недостаток: будет рассчитываться для каждого экземпляра объекта.

Однако в большинстве типичных случаев с django вы будете запускать только один раз свойства объекта и, вероятно, не будете создавать экземпляр объекта, для которого вы не будете использовать свойство .state. Таким образом, в этих случаях подходы более или менее похожи по «производительности».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...