Bro*_*bay 3 python sqlalchemy python-3.x
假设下面的型号,究竟如何将一个去加载通过一个定单有关的货物subqueryload,由状态过滤is_refunded?
class Order(db.Model):
    id = db.Column(db.Integer, primary_key=True)
class Shipment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    shipment = db.Column(MutableDict.as_mutable(JSONB))
    is_refunded = db.Column(db.Boolean, server_default="false")
    order_id = db.Column(db.Integer, db.ForeignKey('order.id'))
    order = db.relationship('Order', backref='shipments')
我希望遵循以下内容,但这不是有效的语法:
orders = db.session.query(Order).options(
    db.subqueryload(Order.shipments).filter(Shipment.is_refunded==False))
一些背景:
is_refunded状态将设置为True请让我知道是否需要任何澄清。
提前致谢。
有趣的是,我一直想知道一种简单的“选项”方式来完成这种事情,因此上面的语法很有趣。
但是,目前,通过relationship()设置的属性协定是,它们仅直接使用在relationship()中设置的条件。在保持使用所提供的加载程序服务的同时,没有简单的方法可以随时更改标准。
直接使用具有自定义条件的加载程序服务的两个选项是使用联接然后写出查询,然后将其与contains_eager组合(适用于joinedload,而不是真正的子查询负载),或者使用满足以下条件的新的relationship():您要查找的条件(可以通过primaryjoin建立)。
存在子查询加载的另一个选项,它可以自己发出相同的查询,但实际上不使用subqueryload选项。这里的特殊技术是能够使用查询结果填充集合,这样就不会将这些记录为变更事件。为此使用了set_committed_value函数,并在DisjointEagerLoading处示例了一个子查询负载(在内置之前)的“原始”形式的示例。在绝大多数简单情况下,对固定实体滚动自己的“子查询负载”并不难,该示例中对此技术进行了说明。