Код синтаксически допустим, но содержит ошибки 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.