Alguns problemas com o MapperExtension of sqlalchemy
Existem duas classes: Usuário e Pergunta
Um usuário pode ter muitas perguntas e também contém um question_count para registrar a contagem de perguntas que pertencem a ele.
Portanto, quando adiciono uma nova pergunta, desejo atualizar o question_count do usuário. No começo, faço como:
question = Question(title='aaa', content='bbb')
Session.add(question)
Session.flush()
user = question.user
### user is not None
user.question_count += 1
Session.commit()
Tudo vai bem.
Mas não quero usar o retorno de chamada de evento para fazer a mesma coisa. Como segue:
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()}
....
Observe o método "after_insert":
instance.user # -> Get None!!!
Por quê?
Se eu mudar essa linha para:
Session.query(User).filter_by(id=instance.user_id).one()
Posso obter o usuário com êxito, mas: o usuário não pode ser atualizado!
Olha, eu modifiquei o usuário:
user.question_count += 1
Mas não há sql de 'atualização' impresso no console, e oquestion_count
não são atualizados.
Eu tento adicionarSession.flush()
ouSession.commit()
noafter_insert()
método, mas ambos causam erros.
Falta alguma coisa importante? Por favor me ajude, obrigado