Обновление статуса обратной связи с отправкой письма

Проблемы здесь не в синтаксисе, а в контрактах APIView, Celery и сохранения. Передавайте id, ставьте задачу после commit и возвращайте Response; отправка письма не гарантирует успешный save.

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

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

Проблемы здесь не в синтаксисе, а в контрактах APIView, Celery и сохранения. Передавайте id, ставьте задачу после commit и возвращайте Response; отправка письма не гарантирует успешный save.

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

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

Условие

В проекте присутствует API‑контроллер CreateFeedbackAPIView, который создает запись модели Feedback, а затем асинхронно инициирует задачу change_status_feedback. Эта задача меняет статус обратной связи и вызывает функцию send_mail(). Требуется выполнить ревью кода, обнаружить синтаксические неточности и убедиться, что взаимодействие с Celery‑задачей, процесс сериализации и сохранение объекта реализованы корректно.

@app.task(name='change_status_feedback')
def change_status_feedback(feedback):
    feedback.status = 'in_progress'
    send_mail()
    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, Celery и сохранения. Передавайте id, ставьте задачу после commit и возвращайте Response; отправка письма не гарантирует успешный save.

APIView не предоставляет get_serializer и не вызывает create для POST: нужен post либо CreateAPIView. Модель Feedback нельзя штатно передать через JSON-сериализатор задачи; worker должен загрузить её по id.

Статус in_progress сначала меняется только в памяти. Если send_mail упадёт, save не выполнится; если письмо уйдёт, а save упадёт, повтор может отправить дубль. Фиксируйте переходы состояния отдельно, учитывайте повторные доставки задачи и используйте outbox/идемпотентную отправку. Аргументы стандартного Django send_mail обязательны; без них показанный вызов также некорректен.

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

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

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

Подробнее