2013-12-20 3 views
4

Я попал в очень неприятную ситуацию. У меня есть следующая настройка. У меня есть модель django, представляющая FSM с django FSM fieldМодель Django не сохраняется в базе данных внутри задачи Celery

У меня есть задача сельдерея, которая отправляет электронное письмо, а затем передает состояние основных объектов FSM. С точки зрения задачи сельдерея объект «кажется» сохраняется. Но с точки зрения основного django-процесса объект не обновляется. Странно, что вспомогательные объекты сохраняются должным образом в БД, а затем доступны из основного процесса django.

я явно вызвать .save() на объекте от задачи сельдерея и date_last_modified = models.DateTimeField(auto_now=True, null=True) поля имеет более позднюю метку времени в сельдерее задаче, чем основной поток, хотя я не уверен, что это признак чего-либо, то это может иметь был обновлен, но обновление не было сброшено в БД.

Я использую Django 1.5.1, 9.3.0, PostgreSQL сельдерея v3.1.0, Redis 2.6.10

Запуск сельдерей как так $ celery -A tracking worker -E -B -l info

Любые идеи, почему это может происшествие было бы весьма полезно

ответ

3

Вы повторно получаете объект после сохранения? То есть не просто глядя на экземпляр, который вы получили до сохранения?

1

Как насчет транзакций? Вы можете попробовать установить CELERY_EAGER_PROPAGATES_EXCEPTIONS=True и запустить сельдерей с -l DEBUG, чтобы увидеть, возникает ли ошибка после модели .save() call.

Также заботиться о параллельных обновлениях. Когда один процесс читает модель, сельдерей читает и сохраняет одну и ту же модель, если начальные вызовы процессов models.save() позже будут перекрывать все поля в нем.

+2

Параллельные обновления были проблемой в моем случае, установка https://django-save-the-change.readthedocs.org помогла. Благодаря! –

1

У меня была аналогичная проблема с Django 1.5

Я предполагаю, что это из-за этого Джанго не вносить изменения в базу данных немедленно.

Добавление

'OPTIONS': { 
     'autocommit': True 
    } 

к DATABASES настройки исправили проблему для меня.

Проблема не будет в Django 1.6+ beacuse autocommit по умолчанию там.

Смежные вопросы