Вступить в клуб →
средняявопросКэш, очереди и надёжность сервисов

В фоновую задачу передали объект заказа: почему так делать нельзя

В обработчике HTTP-запроса написано так:

order = Order.objects.get(pk=pk)
process_order.delay(order)

Задача либо не ставится из-за ошибки сериализации, либо (после переключения формата сообщений) воркер обрабатывает данные, которые расходятся с текущим состоянием базы.

Как сделать правильно?

  • Вызвать order.refresh_from_db() непосредственно перед delay, чтобы данные были свежими
  • Заменить delay на apply_async — этот вызов умеет передавать объекты модели целиком
  • Передавать в задачу идентификатор заказа и читать объект уже внутри воркера
  • Увеличить допустимый размер сообщения в настройках брокера и включить формат pickle

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела