Текущий пример некорректен: APIView не вызывает create как стандартный POST-handler, а Celery нужно передавать ID, не ORM-экземпляр.
Проверка работы отложенного задания по изменению статуса обратной связи
Текущий пример некорректен: APIView не вызывает create как стандартный POST-handler, а Celery нужно передавать ID, не ORM-экземпляр.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо убедиться, что после создания записи модели Feedback вызывается отложенная задача change_status_feedback.delay(feedback), и она корректно меняет статус объекта. Для этого в представлении создаётся объект Feedback, а затем запускается Celery‑задача, которая должна установить поле status в значение 'in_progress' и сохранить изменения.
@app.task(name='change_status_feedback')
def change_status_feedback(feedback):
feedback.status = 'in_progress'
feedback.save()
class CreateFeedbackAPIView(APIView):
def create(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
feedback = Feedback.objects.create(**serializer.validated_data)
change_status_feedback.delay(feedback)
return feedback
Ответ
Текущий пример некорректен: APIView не вызывает create как стандартный POST-handler, а Celery нужно передавать ID, не ORM-экземпляр.
Используйте CreateAPIView с serializer_class и perform_create, либо реализуйте post вручную. После serializer.save() зарегистрируйте transaction.on_commit(lambda: change_status_feedback.delay(feedback.pk)).
Задача принимает ID и выполняет условное обновление из допустимого начального статуса в in_progress, чтобы повторный запуск не откатил более позднее состояние. Исчезнувшую запись обрабатывайте явно.
В тесте представления подмените .delay, выполните commit-callback и проверьте переданный идентификатор. Отдельно вызовите тело задачи в изолированной БД и проверьте статус, повторное выполнение и отсутствие записи. Запуск настоящего worker для такого unit/feature-теста не нужен.