Найти - Пользователи
Полная версия: Не работает функция в модели User
Начало » Django » Не работает функция в модели User
1
Elaphe
Не работает функция, которая делает инкремент в одно поле и декремент в другое..
 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, она выполняется (в логах с помощью специальной батарейки пишутся запросы к БД), никаких ошибок, все прекрасно, но - поля не обновляются.
Простейшая функция вроде, не пойму что там может сломаться…
Elaphe
В общем, у джанги такая (неясная мне пока) логика.
Метод make_request вызывался из вьюхи DRF
Если во вьюхе (уже после вызова функции make_request, это видно по логам) возникало исключение (а оно возникало, потому что кое-что не доделано), то изменения, сделанные в User, откатывались.
Метод заработал, когда закомментировала конец функции и стала возвращать нормальный response (отсутствие response вызывало тот же эффект - изменения откатывались, что тоже странно, какая связь?)
Буду признательна, если кто-нибудь объяснит, почему так.
Slow
Возможно, запоздало, но отвечу.

У DRF в дефолтном `exception_handler`е почти для всех типов ошибок вызывается замечательная такая штука `set_rollback`, что и приводит к такому поведению. Зачем? Ну, транзакционная целостность. Запрос выполнен с ошибкой - откатываем транзакцию.

Изменить поведение можно, но если возникают подобные вопросы, делать этого точно не стоит.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB