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))
)

Большое спасибо

Вернуться на верх