Я думаю, что простая атомарная транзакция должна решить вашу проблему.
from django.db import transaction
def save(self, *args, **kwargs):
with transaction.atomic():
max_version = MyModel.objects \
.filter(name=self.name) \
.aggregate(max_version=Max('version'))['max_version'] or 0
self.version = max_version + 1
super(MyModel, self).save(*args, **kwargs)
Несмотря на то, что за рамками фактического вопроса, вы можете обновить только поле version
при создании записи (сохранение в первый раз).Вы можете сделать это, убедившись, что pk
равен None
следующим образом.
from django.db import transaction
def save(self, *args, **kwargs):
if self.pk is None:
with transaction.atomic():
max_version = MyModel.objects \
.filter(name=self.name) \
.aggregate(max_version=Max('version'))['max_version'] or 0
self.version = max_version + 1
super(MyModel, self).save(*args, **kwargs)
else:
super(MyModel, self).save(*args, **kwargs)