Форум сайта python.su
Не работает функция, которая делает инкремент в одно поле и декремент в другое..
from django.contrib.auth.models import AbstractUser from django.db import models from django.db.models import F class User(AbstractUser): month_requests = models.IntegerField('Количество запросов за месяц', default=0) remained_requests = models.IntegerField('Осталось запросов', default=1000) def make_request(self): self.month_requests = F('month_requests') + 1 self.remained_requests = F('remained_requests') - 1 self.save()
Офлайн
В общем, у джанги такая (неясная мне пока) логика.
Метод make_request вызывался из вьюхи DRF
Если во вьюхе (уже после вызова функции make_request, это видно по логам) возникало исключение (а оно возникало, потому что кое-что не доделано), то изменения, сделанные в User, откатывались.
Метод заработал, когда закомментировала конец функции и стала возвращать нормальный response (отсутствие response вызывало тот же эффект - изменения откатывались, что тоже странно, какая связь?)
Буду признательна, если кто-нибудь объяснит, почему так.
Офлайн
Возможно, запоздало, но отвечу.
У DRF в дефолтном `exception_handler`е почти для всех типов ошибок вызывается замечательная такая штука `set_rollback`, что и приводит к такому поведению. Зачем? Ну, транзакционная целостность. Запрос выполнен с ошибкой - откатываем транзакцию.
Изменить поведение можно, но если возникают подобные вопросы, делать этого точно не стоит.
Офлайн