Состояние гонки при вставке новых записей в базу данных двумя разными пользователями в Django

Есть ситуация условие гонки, когда я хочу создать новый экземпляр модели Order.
Есть поле daily_id, в котором ежедневный день для любой категории начинается с единицы. Это означает, что каждая категория имеет свой собственный ежедневный идентификатор.

class Order(models.Model):
    daily_id = models.SmallIntegerField(default=0)
    category = models.ForeignKey(Categoty, on_delete=models.PROTECT, related_name="orders")
    declare_time = models.DateField()
    ...
}
Поле

daily_id новой записи вычисляется с помощью этого метода:

def get_daily_id(category, declare_time):
    try:
        last_order = Order.objects.filter(declare_time=declare_time,
                                          category=category).latest('daily_id')
        return last_order.daily_id + 1
    except Order.DoesNotExist:
        # If no order has been registered in declare_time date.
        return 1

Проблема в том, что когда два разных пользователя одновременно регистрируют заказы в одной категории, велика вероятность того, что заказы имеют повторяющиеся daily_id значения.

Я пробовал @transaction.atomic декоратор для post метода DRF APIView и это не сработало!

Вы должны использовать автоинкремент и добавить представление, которое вычисляет ваш семантический порядок, например :

SELECT *, ROW_NUMBER() OVER(PARTITION BY MyDayDate ORDER BY id_autoinc) AS daily_id
Вернуться на верх