【问题标题】:Convert relationship to query object将关系转换为查询对象
【发布时间】:2012-08-07 08:40:23
【问题描述】:

假设我在表 User 和 Car 之间存在多对多关系。

当我使用它时效果很好

User.query.filter_by(name='somename').all().cars

Car.query.filter_by(vin='xxxxxx').all().users

我创建了将 BaseQuery 转换为 xml 对象的函数,因此我需要从 Car.query.filter_by(vin='xxxxxx').all().users 中提取 BaseQuery。

有什么办法吗?

【问题讨论】:

    标签: python mysql sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    老实说,我看不出您提供的代码示例实际上是如何工作的,因为Query.all() 返回一个列表。所以[].users 应该会产生错误。

    无论如何,以下是几个选项:

    # 1: this should be fine
    qry1 = Car.query.join(User, Car.users).filter(User.name=='you')
    
    # 1: this will probably not work for you, as this is not one query, although the result is a Query instance
    usr1 = User.query.filter_by(name='you').one()
    qry2 = Car.query.with_parent(usr1)
    
    # 3: you might define the relationship to be lazy='dynamic', in which case the query object instance will be returned
    from sqlalchemy.orm.query import Query
    class Car(Base):
        __tablename__ = 'cars'
        id = Column(Integer, primary_key=True)
        vin = Column(String(50), unique=True, nullable=False)
    
        users = relationship(User, secondary=user_cars, 
                #backref='cars',
                backref=backref('cars', lazy="dynamic"),
                lazy="dynamic",
                )
    qry3 = Car.query.filter_by(name="you").one().cars
    assert isinstance(qry3, Query)
    

    在此处查看有关选项 3 的更多信息:orm.relationship(...)

    【讨论】:

    • 您知道是否可以将“正常”关系转换为“动态”关系吗?我调查了查询选项,甚至调查了“sqlalchemy.inspect(entity).relationships` 来愚弄一下,但可以找到任何有用的东西。
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2019-12-29
    相关资源
    最近更新 更多