2013-05-08 109 views
1

我正在學習python,並使用框架金字塔和sqlalchemy作爲orm。我無法弄清楚關係是如何工作的。我有2個桌子,辦公室和用戶。外鍵在用戶表'offices_id'上。我試圖做一個查詢,將返回給我一個用戶是什麼辦公室的一部分。如何編寫查詢以獲取關係中的sqlalchemy對象?

這是我如何設置我的模型。

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 
Base = declarative_base() 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(255), unique=True, nullable=False) 
    trec_number = Column(Unicode(255), unique=True, nullable=False) 
    office_id = Column(Integer, ForeignKey('offices.id')) 

class Office(Base): 
    __tablename__ = 'offices' 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(255), unique=True, nullable=False) 
    address = Column(Unicode(255), unique=True, nullable=False) 
    members = relationship("User", backref='offices') 

在我看來,我怎麼會寫的查詢將返回辦公室信息給定用戶?

我想這一點:

for user in DBSession.query(User).join(Office).all(): 
    print user.address 

,但我想我誤解了查詢的工作,因爲我不斷收到錯誤

AttributeError: 'User' object has no attribute 'address' 

當我這樣做:

for user in DBSession.query(User).join(Office).all(): 
    print user.name 

它打印出用戶名稱很好,因爲name是User類的一個屬性。

我也無法得到逆工作

for offices in DBSession.query(Office).join(User).all(): 
    print offices.users.name 

回答

3

您需要使用您在backref參數用於訪問Office模型的名稱。嘗試user.offices.address

+3

stackoverflow需要買一個啤酒按鈕。謝謝,工作完美。 – 2013-05-08 22:49:50

+0

現在我被困在做反面。 DBSession.query(Office).join(User).all(): offices.user.name不起作用。 – 2013-05-09 14:40:23

+0

模型上的屬性是名稱成員,你有沒有試過offices.members?這應該給你一個列表而不是單個對象,因爲它是一對多的關係。 – 2013-05-09 14:44:43

相關問題