所以我有一个表 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/