Обновление счетчика с максимальным значением из таблицы с помощью одного запроса
У меня есть поле certification_counter
, которое по умолчанию равно 0
. Мне нужно увеличить его, получив предыдущее максимальное значение в таблице, но минимальное значение должно быть MIN_CERTIFICATION_COUNTER
.
Я написал запрос следующим образом:
last_value_qs = Project.objects.order_by("-certification_counter")
Project.objects.filter(id=project.id).annotate(
last_counter=Subquery(
last_value_qs.values("certification_counter")[:1], output_field=IntegerField()
),
max_counter=Greatest(
F("last_counter"), MIN_CERTIFICATION_COUNTER
),
).update(certification_counter=F("max_counter") + 1)
И я получаю:
django.db.utils.OperationalError: (1093, "You can't specify target table 'project' for update in FROM clause")
Я хочу реализовать это как одну транзакцию, чтобы избежать состояния гонки, поэтому я не использовал два запроса, например:
max_value = Project.objects.order_by("-certification_counter").last().certification_counter
Project.objects.filter(id=project.id).update(certification_counter=max(max_value, MIN_CERTIFICATION_COUNTER) + 1 )