Проблемы здесь не в синтаксисе, а в контрактах 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 обязательны; без них показанный вызов также некорректен.