Отправка Django‑модели User в задачу Celery

При стандартной JSON-сериализации Celery экземпляр Django User передать нельзя. Передавайте первичный ключ и загружайте актуальную модель внутри задачи; создание новой записи согласуйте с commit.

Короткий ответ

Что ответить на собеседовании

При стандартной JSON-сериализации Celery экземпляр Django User передать нельзя. Передавайте первичный ключ и загружайте актуальную модель внутри задачи; создание новой записи согласуйте с commit.

Подробный разбор

Ответ с пояснениями

Условие

Проверьте, корректно ли работает отложенный вызов задачи change_user_status.delay(usr) при передаче в неё экземпляра модели Django User. Убедитесь, что объект правильно сериализуется, и обсудите возможность передачи вместо полной модели лишь её идентификатора.

from django.contrib.auth import get_user_model

User = get_user_model()
usr = User.objects.get(id=1)

change_user_status.delay(usr)

Ответ

При стандартной JSON-сериализации Celery экземпляр Django User передать нельзя. Передавайте первичный ключ и загружайте актуальную модель внутри задачи; создание новой записи согласуйте с commit.

Пример принципа передачи:

change_user_status.delay(usr.pk)

@app.task
def change_user_status(user_id):
    user = get_user_model().objects.get(pk=user_id)
    # validate transition and update status

Если запись создаётся в текущей транзакции, enqueue выполняйте через transaction.on_commit. Обработайте удаление пользователя до старта задачи. Переход статуса должен переносить повторное выполнение: очередь не гарантирует единственный запуск. Переход на pickle ради передачи ORM-объекта не решает проблему устаревших данных и добавляет риски десериализации.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее