SQLAlchemy 条件关系
我想在两个ORM对象之间建立一个一对多的关系,并且想在这个基础上增加一个第二个关系,这个关系也链接到同一个“多”的对象,同时还要加上一个条件。
下面的例子可以更详细地说明:
class Users(SQLABase):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship('Addresses', backref='user')
class Addresses(SQLABase):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
historic = (String(1))
add1 = Column(String)
user = Column(Integer, ForeignKey('users.id'))
我想要一个属性'Users.valid_addresses',它和同一个'addresses'表有关联,但要过滤掉那些Addresses.historic == 'N'的记录,就像下面的查询一样:
Session.Query(Addresses).filter_by(historic = 'N').all()
我在寻找“SQLAlchemy的做法”。
- 我可以对一个关系应用条件吗?
- 我需要遍历当前关系的结果吗?
- 我应该基于一个应用了条件的SQL视图来创建一个额外的'valid_addresses'对象吗?
我感觉这个问题可能已经有人回答过,但我总是无法正确表达我的问题。
1 个回答
18
这个内容在SQLAlchemy的文档中有讲解,具体可以查看“指定替代连接条件”这一部分。
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
boston_addresses = relationship("Address",
primaryjoin="and_(User.id==Address.user_id, "
"Address.city=='Boston')")
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('user.id'))
street = Column(String)
city = Column(String)
state = Column(String)
zip = Column(String)