SQLAlchemy 条件关系

8 投票
1 回答
8383 浏览
提问于 2025-04-18 05:04

我想在两个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)

撰写回答