Передавайте account.pk, а не экземпляр User. Стандартный JSON-сериализатор Celery не поддерживает ORM-модель; worker должен заново получить пользователя и проверить актуальное состояние.
Отправка модели User в задачу Celery
Передавайте account.pk, а не экземпляр User. Стандартный JSON-сериализатор Celery не поддерживает ORM-модель; worker должен заново получить пользователя и проверить актуальное состояние.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проверьте, как правильно передать объект модели пользователя в асинхронную задачу Celery с помощью метода .delay(). Оцените, какие проблемы могут возникнуть при сериализации ORM‑объекта и какие потенциальные угрозы безопасности стоит учитывать.
from django.contrib.auth import get_user_model
User = get_user_model()
account = User.objects.get(id=1)
change_user_status.delay(account)
Ответ
Передавайте account.pk, а не экземпляр User. Стандартный JSON-сериализатор Celery не поддерживает ORM-модель; worker должен заново получить пользователя и проверить актуальное состояние.
Пример вызова: change_user_status.delay(account.pk). Если пользователь создан в незавершённой транзакции, enqueue перенесите в transaction.on_commit. Задача обрабатывает отсутствие записи и допускает повторный запуск без повторного нежелательного эффекта.
Не включайте pickle только ради удобства сериализации модели: недоверенное сообщение может привести к выполнению кода. Ограничьте доступ к брокеру и принимаемые сериализаторы. Передача id также исключает ненужное копирование полей пользователя в очередь, но сама по себе не заменяет проверку полномочий в точке постановки задачи.