python - 使用 SQLAlchemy ORM 基于多对一关系中的一个对象过滤查询

标签 python mysql sqlalchemy

所以我有一个表 carts 和另一个表 cart_items。购物车像这样连接到购物车商品(使用伪代码)。

购物车:cart_id = 1

cart_item:id = 12,cart_id = 1,in_stock = False

cart_item:id = 13,cart_id = 1,in_stock = False

cart_item:id = 14,cart_id = 1,in_stock = False

我想查询所有至少有一个 in_stock 值为 True 的 cart_item 的购物车

购物车:cart_id = 1

购物车:cart_id = 2

cart_item:id = 12,cart_id = 1,in_stock = False

cart_item:id = 13,cart_id = 1,in_stock = False

cart_item:id = 14,cart_id = 1,in_stock = False

cart_item:id = 15,cart_id = 2,in_stock = True

cart_item:id = 16,cart_id = 2,in_stock = False

cart_item:id = 17,cart_id = 2,in_stock = False

因此给定此数据集,将返回一个 cart_id = 2 的购物车。

此外,我应该提到我知道我可以查询和检索所有对象,然后对该检测列表进行操作以过滤掉所有不符合此要求的对象,但实际上我需要以由于此 Web 应用程序中分页的处理方式而查询。

如果我可以像下面这样在模型中定义某种属性,那就太理想了。但我敢肯定这不会像现在这样起作用。

@property
def cart_has_in_stock(self):
    has_in_stock = False
    for item in self.cart.items:
      if item.in_stock:
        has_in_stock = True
    return has_in_stock

我刚刚想出一个简单的 SQL 查询来执行此操作,现在我只需要帮助将其移至 SQLAlchemy。我不太擅长 SQLAlchemy。

查询:select * from cart_items where cart_items.cart_id IN (select cart.id from cart_items as item INNER JOIN carts AS cart on item.cart_id = cart.id where item.stage = 'stock' 按购物车分组.id)\G;

最佳答案

我想通了。

sub_q = model.Session.query(model.Cart.id).\
        join(model.CartItem, model.Cart.id == model.CartItem.cart_id).\
        filter(
            model.CartItem.stage == 'stock'
        ).\
        group_by(model.Cart.id).\
        subquery()

correct_q = model.Session.query(model.Cart).filter(model.Cart.id.in_(sub_q))

关于python - 使用 SQLAlchemy ORM 基于多对一关系中的一个对象过滤查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59651037/

相关文章:

mysql - 如何删除MYSQL中除2个特定项目外的所有项目

python - UnicodeEncodeError :'latin-1' 编解码器无法对位置 0-1 中的字符进行编码 : ordinal not in range(256)

python - 读取从机,读写主机设置

python - 如何使用 sqlalchemy 关系实现多个连接

python - 如何从任何用户的推特获取 'n' 推文

python - 使用 python 驱动程序在 Neo4j 中创建多个节点的最佳方法

python - 从列表中删除元组

python - 添加/减去具有不同列标签的数据框

mysql - 根据值之间的最小差异连接 Hive 表

mysql - BigQuery REGEXP_REPLACE