Избегайте рекурсивного сохранения () при использовании сельдерея для обновления полей модели Django - PullRequest
12 голосов
/ 31 мая 2011

Я переопределяю метод save () модели для вызова асинхронной задачи с Celery.Эта задача также спасает модель, и поэтому я сталкиваюсь с рекурсивной ситуацией, когда задача Celery вызывается неоднократно.Вот код:

Метод сохранения модели:

def save(self, *args, **kwargs):
    super(Route, self).save(*args, **kwargs)
    from .tasks import get_elevation_data
    get_elevation_data.delay(self)

Задача get_elevation_data:

from celery.decorators import task

@task()
def get_elevation_data(route):
    ...
    route.elevation_data = results
    route.save()

Как я могуизбежать этой рекурсии?

1 Ответ

14 голосов
/ 31 мая 2011

Добавьте аргумент ключевого слова, который говорит сохранить не повторять:

 def save(self, elevation_data=True, *args, **kwargs):
   super(Route, self).save(*args, **kwargs)
   if elevation_data:
     from .tasks import get_elevation_data
     get_elevation_data.delay(self)

А затем:

 from celery.decorators import task

 @task()
 def get_elevation_data(route):
     ...
     route.elevation_data = results
     route.save(elevation_data=False)
...