2014-10-09 3 views
0

Я определил таблицу, используя SQLAlchemy и замэпили к классу:SQLAlchemy: как передать дополнительные параметры при создании экземпляра нового объекта

meta = MetaData(engine) 
item_table = Table(
    'Item', meta, 
    Column('id', Integer, primary_key=True, nullable=False), 
    Column('name', String(40), nullable=False) 
) 

class Item(object): 
    def init(self, created_by): 
     self.created_by = created_by 
    def __repr__(self): 
     return '<Item %r created by %r>' % (self.name, self.created_by) 

mapper(Item, item_table) 

Как вы видите, Item имеет created_by поле, которое не приходит из базы данных. В настоящее время я выживаю с использованием метода item.init("created_by"), который вызывается сразу после создания экземпляра элемента. Я нахожу этот уродливый, возможно, есть лучший способ справиться с этим.

ответ

1

Вы можете подписаться на load событие и выполнить вашу логику там:

class DB(object): 
    def __init__(self): 
     self._register_event() 

    def _get_created_by(self): 
     return datetime.datetime.now() 

    def _register_event(self): 
     @event.listens_for(Item, 'load') 
     def receive_load(target, context): 
      target.created_by = self._get_created_by() 

    def test_select(self): 
     items = session.query(Item).all() 
     for item in items: 
      print(item) 

db = DB() 
db.test_select() 
+0

Я создаю мои детали 'пункт = session.query (п) .get (item_id)', я не вижу, где Я могу передать дополнительный параметр. – Passiday

+1

ОК. Это не * создание * новых объектов. Это * поиск * постоянных объектов из базы данных. Обновил ответ соответственно. – van

+0

Откуда возникает 'created_by', если он не хранится в базе данных? – Eevee

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