Некоторые проблемы с 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()} 
    .... 
  1. Обратите внимание на метод after_insert:

    instance.user # -> Get None !!!

    Почему?

  2. Если я изменю эту строку на:

    Session.query (Пользователь) .filter_by (id = instance.user_id) .one ()

    Я могу получить пользователя успешно, но: пользователь не может быть обновлен!

    Посмотрите, я изменил пользователя:

    user.question_count + = 1

    Но в консоли не напечатано «обновление» sql, и question_count не обновляются.

  3. Я пытаюсь добавить Session.flush () или Session.commit () в after_insert () , но оба вызывают ошибки.

Есть ли что-то важное, что я пропускаю? Пожалуйста, помогите мне, спасибо

6
задан Freewind 5 September 2010 в 17:30
поделиться