Django гоночное условие aggregate(Max) в выражении F()
Представьте себе следующую модель:
class Item(models.Model):
# natural PK
increment = models.PositiveIntegerField(_('Increment'), null=True, blank=True, default=None)
# other fields
Когда создается элемент, я хочу, чтобы поля increment
автоматически приобретали максимальное значение во всей таблице, +1. Например:
|_item____________________________|
|_id_|_increment__________________|
| 1 | 1 |
| 2 | 2 |
| 4 | 3 | -> id 3 was deleted at some stage..
| 5 | 4 |
| 6 | 5 |
.. etc
Когда приходит новый Item()
и становится saved()
, как за один проход и таким образом, чтобы избежать условий гонки, убедиться, что он будет иметь инкремент 6, а не 7 в случае, если другой процесс делает точно то же самое в то же самое время?
Я пробовал:
with transaction.atomic():
i = Item()
highest_increment = Item.objects.all().aggregate(Max('increment'))
i.increment = highest_increment['increment__max']
i.save()
Я хотел бы иметь возможность создать его способом, подобным следующему, но это, очевидно, не работает (проверил такие места, как https://docs.djangoproject.com/en/3.2/ref/models/expressions/#avoiding-race-conditions-using-f):
from django.db.models import Max, F
i = Item(
increment=F(Max(increment))
)
Большое спасибо