Subqueryload上的SQLAlchemy筛选器

2024-05-29 04:45:43 发布

您现在位置:Python中文网/ 问答频道 /正文

假设下面的模型,我们将如何通过一个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')

我希望有以下几行,但这不是有效的语法:

^{pr2}$

一些背景:

  • 订单到发货是一对多的关系。在
  • 根据业务规则,尽管一个订单可能有多个装运关联,但只能有一个“活动”装运。也就是说,所有其他货件的is_refunded状态将设置为True
  • 因此,我只想在遍历所有订单时引用“活动”的装运。在
  • subqueryload返回的标准结果加载并返回所有装运
  • 我使用的是SQLAlchemy的最新稳定版本。在

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

提前谢谢。在


Tags: 订单idtruedbmodelis状态order
1条回答
网友
1楼 · 发布于 2024-05-29 04:45:43

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

但是,目前,通过relationship()设置的属性的约定是,它们只使用在relationship()中直接设置的条件。在使用所提供的加载程序服务的同时,没有简单的方法来动态更改条件。在

直接使用带有自定义条件的加载器服务的两个选项是:使用连接写出查询,然后与contains_eager结合使用(这适用于joinedload,而不是真正的subqueryload),或者使用满足所需条件的新relationship()(通过primaryjoin建立)。在

subqueryload还有另一个选项,即自己发出相同的查询,但实际上不使用subqueryload选项。这里的特殊技术是能够用查询的结果填充集合,这样就不会将这些结果记录为更改事件。为此使用了set_committed_value函数,一个示例说明了subqueryload的“原始”形式(在内置之前)说明了这一点,在DisjointEagerLoading处。对于绝大多数简单的情况,针对固定实体滚动您自己的“subqueryload”并不是很困难,在该示例中说明了该技术。在

相关问题 更多 >

    热门问题