Назначьте пользовательское поле order_sl

Я работаю с моделью Django, где мне нужно назначить пользовательское поле order_sl, которое должно увеличиваться от последнего существующего значения с помощью определенного фильтра.

Вот чем я сейчас занимаюсь:

prev_ordr = Order.objects.filter(abc).values("order_sl").first()

if prev_ordr:
 new_order_sl = prev_ordr.get("order_sl")
else:
 new_order_sl = 100000

ins.order_sl = F("order_sl") + (new_order_sl + 1)
ins.save()
ins.refresh_from_db()

Но я считаю, что такой подход проблематичен:

Он извлекает последнее значение в Python вместо того, чтобы обрабатывать его в базе данных.

Он не является потокобезопасным и может сломаться в условиях гонки, если одновременно произойдет несколько вставок.

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

❓ Каков наилучший, безопасный для Django и оптимизированный для PostgreSQL способ справиться с этим? Была бы лучше необработанная последовательность SQL? Или я должен использовать select_for_update() с блоком транзакций?

Спасибо!

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