Transaction.atomic() откатывается назад, если выполняется другой запрос
У меня проблемы с Django
в transaction.atomic
. У меня есть приложение, в котором пользователи могут обновлять свою информацию, но я буду приводить пример здесь. Поэтому я хочу предотвратить обновление этого поля, если получено более одного запроса, поэтому я хочу заблокировать строку, для чего я использую transaction.atomic
и select_for_update
. Итак, у меня есть модель UserProfile, в которой я хочу обновить некоторую информацию, метод, который я использую для обновления, приведен ниже
Class Profile(models.Model):
def get_queryset(self):
return self.__class__.objects.filter(id=self.id)
@transaction.atomic()
def update_age(
self,
age: int,
) -> None:
obj = self.get_queryset().select_for_update().get()
obj.age = age
obj.save()
Ниже - вид
class UserProfileView(APIView):
def put(self, request):
profile = rquest.user.profile
profile.update_age(request.data["age"])
UpdateHistory.objects.create(user=request.user, updated_field="age")
Проблема в том, что UpdateHistory
объект создается, но обновление возраста откатывается, но когда я удаляю создание UpdateHistory, возраст действительно успешно обновляется. Таким образом, приведенный выше код только создает UpdateHistory, но не обновляет возраст UserProfile. Но если я удалю строку UpdateHistory.objects.create(user=request.user, updated_field="age")
, возраст будет успешно обновлен.
Ни одно исключение не поднимается вообще, это сбивает меня с толку уже несколько дней. Надеюсь, что смогу получить помощь. Заранее спасибо
Я бы просто использовал джанго update
:
self.get_queryset().update(age=age)