Django как сделать транзакции для оформления заказа?

Доброго времени суток!
База - Postresql
Есть вьюха от CreateView
В ней создается заказ.
Что-то наподобие такого:
def form_valid(self, form):
    with transaction.atomic():
        order = form.save(commit=False)
        order.status = 'processed'
        # некоторые изменения полей order
        order.save()
        transaction.on_commit(lambda: create_order_print_archive.delay(order.pk))
    return self.render_to_response(self.get_context_data(form=form, order=order, payment_form=payment_form))

В задаче create_order_print_archive происходит генерация и сохранение изображений (задача относительно времязатратная)
@task
def create_order_print_archive(order_pk):
    order = Order.objects.get(pk=int(order_pk))
    # генерация изображений
    args = [
        'node', full_path_to_js, order_item_image.image.path, str(print_width), str(print_height),
        str(editor_width), str(editor_height), page_json, site_domain
    ]
    process = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    output, errors = process.communicate()
    if errors:
        raise NodeJSError(errors)
    process.wait()
    order.status = 'new'
    order.save()
    return True

Но! Иногда (именно иногда, выловить пока не получается) Происходит следующее: вьюха выполняется, заказ создается, задача выполняется, но изменения, сделанные в задаче, не сохраняются. Я логгировал состояния в задаче: после сохранения еще раз доставал заказ по id и выводил статус и он был 'new'. Видимо, где-то происходит rollback у транзакции или что-то подобное.
Я даже не знаю, в какую сторону копать. В доке, если я правильно понял, надо писать именно так.
Подскажите, как надо сохранять заказы? Или что я делаю не так?
  • Вопрос задан
  • 1200 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы