Назначьте пользовательское поле 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() с блоком транзакций?
Спасибо!