Доброго времени суток!
База - 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 у транзакции или что-то подобное.
Я даже не знаю, в какую сторону копать. В доке, если я правильно понял, надо писать именно так.
Подскажите, как надо сохранять заказы? Или что я делаю не так?