Передавайте в задачу первичный ключ Feedback и ставьте её после commit. В worker заново читайте запись или выполняйте условное обновление статуса.
Отложенное изменение статуса Feedback после его создания
Передавайте в задачу первичный ключ Feedback и ставьте её после commit. В worker заново читайте запись или выполняйте условное обновление статуса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В процессе работы создаётся экземпляр модели Feedback, после чего инициируется Celery‑задача change_status_feedback, которая должна переключить поле status на значение 'in_progress'. Требуется провести ревью кода: убедиться, что задача вызывается корректно, аргументы передаются в подходящем виде, взаимодействие с ORM реализовано без ошибок, а также оценить потенциальные исключения во время выполнения.
from asset_main.celery import app
@app.task(name='change_status_feedback')
def change_status_feedback(feedback):
feedback.status = 'in_progress'
feedback.save()
feedback = Feedback.objects.create(**validate_data)
change_status_feedback.delay(feedback)
Ответ
Передавайте в задачу первичный ключ Feedback и ставьте её после commit. В worker заново читайте запись или выполняйте условное обновление статуса.
from django.db import transaction
@app.task(name='change_status_feedback')
def change_status_feedback(feedback_id):
return Feedback.objects.filter(
pk=feedback_id, status='new'
).update(status='in_progress')
with transaction.atomic():
feedback = Feedback.objects.create(**validate_data)
transaction.on_commit(
lambda pk=feedback.pk: change_status_feedback.delay(pk)
)
new замените фактическим начальным статусом модели. ORM-объект обычно не сериализуется JSON-сериализатором Celery, а ID сериализуется. Повтор задачи не должен возвращать завершённую запись в работу. Учтите удаление записи, ошибки БД и недоступность брокера; on_commit не заменяет outbox, если доставка задания обязательна.