2011-01-15 2 views
0

Я использую SQLAlchemy в своем проекте.SQLAlchemy: Передача параметра объекту

У меня есть два класса, называть их Bar и Foo

class Bar(object): 
    def valueize(self, name): 
     # do some crazy magic 
     return value 


class Foo(Base): 
    id = Column(... 
    name = Column(... 

    @property 
    def value(self): 
     return self._bar.valueize(self.name) 

Foo строится либо мною построение объекта непосредственно или с помощью SQLAlchemy, когда он загружает объекты Foo из базы данных. Но для работы Foo нужен объект Bar. Но как мне получить ссылку на Bar в Foo?

Обычно я просто передаю панель в конструктор Foo. Однако это не будет работать, потому что SQLAlchemy создает объект.

Что я хочу сделать, так или иначе сконфигурировать сеанс с объектом Bar, чтобы этот объект штриха вводился в объекты Foo, когда они добавляются в сеанс.

Что я Пробовал

SQLAlchemy имеет систему событий. Одним из событий сеанса является on_attach. Это вызывается всякий раз, когда объект добавляется в сеанс. Однако он не вызывается, когда объект загружается из базы данных.

Есть события, которые вызывается при загрузке из базы данных, но они основаны на каждом модуле. Объект Bar должен быть связан с отдельным сеансом.

ответ

0

Если вам нужен только один Bar для всех Foo s, вы можете использовать его свойство или способ в Foo. Поскольку вы не сделали этого очевидного пути, вам, похоже, нужно построить новый Bar для каждого нового Foo. Возможно, instrumentation имеет необходимые события. Пример кэширования должен иметь возможность перехватывать события загрузки.

+0

Мне нужен один столбец на sqlalchemy Session. Я могу поймать загрузку с помощью инструментального события, но я не могу прикрепить его к сеансу. –

+0

Как только вы посмотрите на объект Session, вы можете недорого проверить, есть ли у него связанный бар. Если это не так, вы можете связать бары прямо на месте. Если вы получаете сеанс неявно, вы можете изменить свой код, чтобы сначала получить сеанс, и проверить/исправить его. Что случилось с этой картиной? – 9000

+0

Проблема в том, что я должен перепрыгнуть через несколько обручей, чтобы эта стратегия работала. Я должен как-то «ассоциировать» сеансы и бары. Я должен использовать какое-то оборудование для обнаружения, когда строится новый объект. Все это кажется большим количеством кода, просто желающего передать дополнительные параметры объекту. Я надеялся, что кто-то может указать на более чистый способ сделать это. –

Смежные вопросы