假设以下模型,我们将如何通过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
。如果需要澄清,请告诉我。
提前谢谢。
发布于 2015-03-11 11:56:21
有趣的是,我一直在想一种简单的“选项”来做这种事情,所以上面的语法很有趣。
但是,目前,通过relationship()建立的属性契约是,它们只直接使用在relationship()中设置的标准。在使用所提供的加载程序服务的同时,没有简单的方法可以动态地更改标准。
直接使用带有自定义条件的加载器服务的两个选项是,要么使用连接写出查询,然后将其与渴望组合(这适用于联合加载,而不是真正的子查询负载),要么使用满足所需条件的新关系()(通过主连接建立)。
另一个用于subqueryload的选项是自己发出相同的查询,而不是实际使用subqueryload选项。这里的特殊技术是能够使用查询的结果填充集合,这样就不会将它们记录为更改事件。为此使用了价值函数,并通过一个示例说明了子查询负载的“原始”形式(在其内置之前),在DisjointEagerLoading上说明了这一点。在绝大多数简单情况下,将自己的"subqueryload“滚动到固定实体并不是很困难,该技术在该示例中得到了说明。
https://stackoverflow.com/questions/28994497
复制