При стандартной JSON-сериализации Celery экземпляр Django User передать нельзя. Передавайте первичный ключ и загружайте актуальную модель внутри задачи; создание новой записи согласуйте с commit.
Отправка Django‑модели User в задачу Celery
При стандартной 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-объекта не решает проблему устаревших данных и добавляет риски десериализации.