Уведомления

Группа в Telegram: @pythonsu

#1 Март 16, 2018 19:42:28

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Не работает функция в модели User

Не работает функция, которая делает инкремент в одно поле и декремент в другое..

 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, она выполняется (в логах с помощью специальной батарейки пишутся запросы к БД), никаких ошибок, все прекрасно, но - поля не обновляются.
Простейшая функция вроде, не пойму что там может сломаться…

Офлайн

#2 Март 16, 2018 20:04:59

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Не работает функция в модели User

В общем, у джанги такая (неясная мне пока) логика.
Метод make_request вызывался из вьюхи DRF
Если во вьюхе (уже после вызова функции make_request, это видно по логам) возникало исключение (а оно возникало, потому что кое-что не доделано), то изменения, сделанные в User, откатывались.
Метод заработал, когда закомментировала конец функции и стала возвращать нормальный response (отсутствие response вызывало тот же эффект - изменения откатывались, что тоже странно, какая связь?)
Буду признательна, если кто-нибудь объяснит, почему так.

Офлайн

#3 Март 26, 2018 18:18:16

Slow
Зарегистрирован: 2017-07-26
Сообщения: 88
Репутация: +  4  -
Профиль   Отправить e-mail  

Не работает функция в модели User

Возможно, запоздало, но отвечу.

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

Изменить поведение можно, но если возникают подобные вопросы, делать этого точно не стоит.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version