Я пытаюсь создать объект MyModel
, но я хочу установить в поле bar
увеличенное значение уже существующего наибольшего значения bar
в дБ для указанного foo
. Проблема здесь в условиях гонки. Я хотел выполнить все логи c на стороне БД за один шаг без успеха. Я нашел решение, но это не самый элегантный способ. Бесконечные циклы всегда плохая идея.
from django.db import models, IntegrityError
from django.db.models import Max
class MyModel(models.Model):
foo = models.UUIDField(default=uuid4)
bar = models.PositiveIntegerField()
class Meta:
constraints = [
models.UniqueConstraint(
fields=['id', 'other_id'],
name='unique_id_other_id'
)
]
@classmethod
def create_my_model(cls, data):
while True:
bar = (cls.objects.filter(foo=data['foo']).aggregate(Max('bar')).get('bar_max')
or 0) + 1
try:
cls.objects.create(bar=bar, **data)
except IntegrityError:
continue
Я буду рад, если кто-нибудь может указать мне любое направление, как справиться с этим. BR