Изменение статуса фидбэка с отправкой письма

Код синтаксически допустим, но содержит ошибки DRF и очереди: APIView не предоставляет get_serializer(), POST не вызывает create(), модель нельзя передавать в обычную JSON-задачу, а вернуть нужно Response.

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

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

Код синтаксически допустим, но содержит ошибки DRF и очереди: APIView не предоставляет get_serializer(), POST не вызывает create(), модель нельзя передавать в обычную JSON-задачу, а вернуть нужно Response.

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

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

Условие

Есть 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

Ответ

Код синтаксически допустим, но содержит ошибки DRF и очереди: APIView не предоставляет get_serializer(), POST не вызывает create(), модель нельзя передавать в обычную JSON-задачу, а вернуть нужно Response.

Используйте CreateAPIView с serializer_class и perform_create() либо GenericAPIView с post(). Сохраните Feedback через serializer.save(), затем отправьте feedback.pk, а worker загрузит запись по ID. Задачу ставьте после commit через transaction.on_commit(), чтобы она не опередила фиксацию. Вызов send_mail() без аргументов корректен только для специально определённой обёртки; у стандартной функции Django другой контракт. Обновление статуса и отправка письма не атомарны: для защиты от пропусков и дублей нужны outbox, состояние доставки и идемпотентная обработка.

Источник: www.django-rest-framework.org.

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

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

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

Подробнее