Всем привет! Подскажите решение. Есть модель Profile с полем balance, который хранится в базе в decimal.
У модели Profile есть метод который изменяет баланс:
def update_profile(self, amount):
self.balance += amount
if self.balance < 0:
return False
else:
self.save(update_fields=["balance"])
return True
Насколько я понимаю в случае если будет конкурентный запрос, то значение будет записано не верно. Читал про select_for_update, но насколько я понял его можно использовать только с транзакциями. Пробовал тестировать этот метод в TestCase и TransactionTestCase получал ошибку:
TransactionManagementError: select_for_update cannot be used outside of a transaction.
Еще видел решение через объект F но там сразу в методе update все происходит, мне же нужно проверять на отрицательное значение. Что можете посоветовать?