首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子负载上的SQLAlchemy滤波器

子负载上的SQLAlchemy滤波器
EN

Stack Overflow用户
提问于 2015-03-11 18:24:13
回答 1查看 2.9K关注 0票数 5

假设以下模型,我们将如何通过subqueryload装载与订单相关的货物,并根据is_refunded的状态进行过滤

代码语言:javascript
运行
复制
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')

我希望得到一些类似于以下内容的内容,但这不是有效的语法:

代码语言:javascript
运行
复制
orders = db.session.query(Order).options(
    db.subqueryload(Order.shipments).filter(Shipment.is_refunded==False))

一些背景:

  • 订购装船是一对多的关系。
  • 根据业务规则,虽然可能有许多与订单相关的货件,但只能有一批“活动”货件。即。所有其他货物的is_refunded状态将设置为True
  • 因此,我只想提及在遍历所有订单时“活动”的货物。
  • 由subqueryload返回的标准结果并返回所有货物。
  • 我正在使用SQLAlchemy的最新稳定版本。

如果需要澄清,请告诉我。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-11 19:56:21

有趣的是,我一直在想一种简单的“选项”来做这种事情,所以上面的语法很有趣。

但是,目前,通过relationship()建立的属性契约是,它们只直接使用在relationship()中设置的标准。在使用所提供的加载程序服务的同时,没有简单的方法可以动态地更改标准。

直接使用带有自定义条件的加载器服务的两个选项是,要么使用连接写出查询,然后将其与渴望组合(这适用于联合加载,而不是真正的子查询负载),要么使用满足所需条件的新关系()(通过主连接建立)。

另一个用于subqueryload的选项是自己发出相同的查询,而不是实际使用subqueryload选项。这里的特殊技术是能够使用查询的结果填充集合,这样就不会将它们记录为更改事件。为此使用了价值函数,并通过一个示例说明了子查询负载的“原始”形式(在其内置之前),在DisjointEagerLoading上说明了这一点。在绝大多数简单情况下,将自己的"subqueryload“滚动到固定实体并不是很困难,该技术在该示例中得到了说明。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28994497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档