SQLAlchemy 条件关系

shw*_*oop 3 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'))
Run Code Online (Sandbox Code Playgroud)

我想要一个属性 'Users.valid_addresses' 与相同的 'addresses' 表过滤相关,其中 Addresses.historic == 'N' 像下面的查询:

Session.Query(Addresses).filter_by(historic = 'N').all()
Run Code Online (Sandbox Code Playgroud)

我正在寻找“SQLAlchemy 方式”。

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

我觉得这已经得到了回答,但我没有正确地表达这个问题。

ink*_*pen 9

This is covered in the SQLAlchemy docs under "Specifying Alternate Join Conditions".

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)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。正在考虑过滤器而不是连接。 (2认同)