Некоторые проблемы с MapperExtension из sqlalchemy
Есть два класса: пользователь и вопрос
У пользователя может быть много вопросов, и он также содержит question_count для записи количества вопросов, которые ему принадлежат.
Поэтому, когда я добавляю новый вопрос, я хочу обновить счетчик вопросов пользователя. Сначала я делаю как:
question = Question(title='aaa', content='bbb')
Session.add(question)
Session.flush()
user = question.user
### user is not None
user.question_count += 1
Session.commit()
Все идет хорошо.
Но я не хочу использовать функцию обратного вызова события, чтобы сделать то же самое. Следующим образом:
from sqlalchemy.orm.interfaces import MapperExtension
class Callback(MapperExtension):
def after_insert(self, mapper, connection, instance):
user = instance.user
### user is None !!!
user.question_count += 1
class Question(Base):
__tablename__ = "questions"
__mapper_args__ = {'extension':Callback()}
....
Обратите внимание на метод after_insert:
instance.user # -> Get None!!!
Зачем?
Если я изменю эту строку на:
Session.query(User).filter_by(id=instance.user_id).one()
Я могу получить пользователя успешно, но: пользователь не может быть обновлен!
Смотри, я изменил пользователя:
user.question_count += 1
Но в консоли нет «обновления» sql, иquestion_count
не обновляются.
Я пытаюсь добавитьSession.flush()
или жеSession.commit()
вafter_insert()
метод, но оба вызывают ошибки.
Есть ли что-то важное, что мне не хватает? Пожалуйста, помогите мне, спасибо