SQLAlchemy条件关系

时间:2014-05-02 02:21:15

标签: python 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.historic =='N'就像下面的查询一样:

Session.Query(Addresses).filter_by(historic = 'N').all()

我正在寻找“SQLAlchemy方式”。

  • 我可以将条件应用于关系吗?
  • 我是否希望迭代当前关系的结果?
  • 我应该根据SQL创建一个额外的'valid_addresses'对象 应用条件的地址表的视图?

我觉得这已经得到了解答,但我没有正确地说出这个问题。

1 个答案:

答案 0 :(得分:3)

Specifying Alternate Join Conditions”下的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)