В текущем виде задача не гарантирует смену статуса: ORM-объект не подходит для JSON Celery, а APIView использован неверно. Передавайте id после commit; фоновая задача выполняется позже, не «сразу».
Обновление статуса обратной связи через отложенный Celery‑задачу
В текущем виде задача не гарантирует смену статуса: ORM-объект не подходит для JSON Celery, а APIView использован неверно. Передавайте id после commit; фоновая задача выполняется позже, не «сразу».
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проверьте, что отложенный вызов Celery‑задачи корректно меняет поле status у модели Feedback сразу после её создания.
@app.task(name='change_status_feedback')
def change_status_feedback(fb):
fb.status = 'in_progress'
fb.save()
class CreateFeedbackAPIView(APIView):
def create(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
fb = Feedback.objects.create(**serializer.validated_data)
change_status_feedback.delay(fb)
return fb
Ответ
В текущем виде задача не гарантирует смену статуса: ORM-объект не подходит для JSON Celery, а APIView использован неверно. Передавайте id после commit; фоновая задача выполняется позже, не «сразу».
Нужен CreateAPIView с сериализатором или корректный post() у APIView. Ответом должен быть Response с сериализованными данными. После создания используйте on_commit для постановки задачи по fb.pk.
В worker загрузите запись и выполняйте допустимый переход статуса с защитой от повторов, например условным UPDATE по текущему состоянию. Если статус должен стать in_progress уже в ответе на создание, задайте его синхронно при сохранении; Celery нельзя использовать как гарантию немедленного изменения. Отправку в брокер также нужно учитывать как операцию, которая может завершиться ошибкой.