2011-07-30 43 views
3

假設我有這樣的事情:一致應用與SQLAlchemy的

def Tab(Base): 
    a = 'a' 
    b = 'b' 
    c = 'c' 

    def __init__(self): 
    self.c_a = DBSession.query(Table2).filter(Table2.a == self.a).all() 

似乎self.c_a只適用於項目我插入。我想確保在__init__中指定的操作(這只是通過relationship()更好地完成的一個示例,但使用您的想象)適用於所有對象,包括SA從我的數據庫中查詢的對象。有人知道怎麼做嗎?

我覺得我可能會誤解某些東西,如果是這樣,請糾正我。

+0

'def Tab(Base):'。你確定?這可能是'類標籤(基地):'? – SingleNegationElimination

+0

我的意思是'class Tab' ...,對不起。感謝您的更正。使用'@ reconstructor'的 – jeffcook2150

回答

1

你是對的,當使用SA會話加載對象時,不會調用__init__
要在其他情況下執行代碼,請使用Instance Events。我想那load在你的情況下特別有用,但refresh也可能是有趣的。

5

從內側的模型是一種抽象泄漏參考所述數據庫;模型不應該知道它們可能存在的持久性的細節;它們可能不會持久(它們畢竟是模型,可能用於任何計算)。

當試圖與其他實體建立關聯時,應該始終使用relationship(),該工作不管工作如何存在或不存在基礎持久性存儲。更重要的是,當您使用SQLAlchemy進行動態生成的查詢時,關係非常有用;在模型方法中執行查詢不允許這種靈活性。

如果您確定需要在模型層(而不是控制器層,如通常應該的那樣)在會話上操作,那麼應該不是正在使用全局會話實例;總是從目標本身計算會話:

class MyModel(Base): 
    def frobnicate(self): 
     session = sqlalchemy.orm.Session.object_session(self) 
     if session is None: 
      raise ValueError("not connected to a session") 
     session.query(...) 
+0

我最終最終在我的需要中使用了'relation()',但我很沮喪,我必須這樣做。我知道,以這種方式訪問​​會話不一定是最佳做法,但當您有時間限制完成某件事時,它肯定會簡化事情。 ;) – jeffcook2150