В фоновую задачу передали объект заказа: почему так делать нельзя
В обработчике HTTP-запроса написано так:
order = Order.objects.get(pk=pk)
process_order.delay(order)
Задача либо не ставится из-за ошибки сериализации, либо (после переключения формата сообщений) воркер обрабатывает данные, которые расходятся с текущим состоянием базы.
Как сделать правильно?
- Вызвать order.refresh_from_db() непосредственно перед delay, чтобы данные были свежими
- Заменить delay на apply_async — этот вызов умеет передавать объекты модели целиком
- Передавать в задачу идентификатор заказа и читать объект уже внутри воркера
- Увеличить допустимый размер сообщения в настройках брокера и включить формат pickle
