2012-01-19 30 views
2

我有表使用M2M表和關係來獲得具體數據SQLAlchemy的

# File : MyRelations.py 
ACC_ADD_TABLE = Table('acc_add_rel', METADATA, 
    Column('acc_id', ForeignKey('acc.id'), 
      nullable=False), 
    Column('add_id', ForeignKey('address.id'), 
      nullable=False), 
    PrimaryKeyConstraint('add_id', 'acc_id'), 
    ) 

# File : Address.py 
class Address(Base): 
    id = Column(Integer, primary_key=True,) 
    type = Column(String(length=10), nullable=False) 

# File : Account.py 
class Account(Base): 
    id = Column(Integer, primary_key=True,) 
    addresses = relationship('Address', 
          secondary=ACC_ADD_TABLE 
          ) 
# default_address = relationship('Address', 
#       secondary=ACC_ADD_TABLE, 
#       primaryjoin=and_("ACC_ADD_TABLE.add_id==Address.id", 
#           "ACC_ADD_TABLE.acc_id==Account.id", 
#           "Address.type='default'") 
#       ) 

按照我想要訪問帳戶的所有默認地址的例子。我可以使用declared_attr或可以編寫的功能,但有沒有什麼辦法可以結合TableClass屬性在單個and_的操作?

注:Address.py和Account.py都是不同的文件,並且由於循環依賴我不能導入任何模型等模型

THX對您有所幫助。

回答

4

這個工作,而不需要進口:

default_address = relationship('Address', 
         secondary=ACC_ADD_TABLE, 
         primaryjoin="acc.c.id==acc_add_rel.c.acc_id", 
         secondaryjoin="and_(address.c.id==acc_add_rel.c.add_id, address.c.type=='default')", 
         #uselist = True, 
         ) 

如果你確信只有一個默認的地址,你可以使用uselist=True爲了方便。
有時候我更喜歡其他結構針對這種情況,雖然:添加列到Account表:default_address_id和建立基於此列1-[0..1]關係,還是檢查所引用的Address也是Account.addresses M-N關係的一部分。


在側面說明,一個錯字:你的(註釋)的代碼,你應該使用==,而不是="Address.type='default'"。但這並不能解決問題。

+0

Thx @van這是爲我工作:)。我期待着你是我第一個得到答案的人)。 – Nilesh

+2

@Lafada:太棒了!是的,使用SO來關注SA主題。 – van