Pony ORM入门求助:如何实现类Django ORM风格的指定查询
解决Pony ORM中的关联查询问题
嘿,作为Pony ORM的新手,你遇到的这个查询问题其实不难解决,咱们一步步来捋清楚:
你想要实现的SQL逻辑是找出订阅了特定key的RSS源、且订阅未被标记为删除的用户ID,对应到Pony ORM的查询语法,有两种直观的写法,都能达到你的需求:
方式一:直接从Subscription实体出发查询(更贴近你的SQL结构)
这种写法逻辑上和你给出的SQL最匹配,直接从订阅关系入手筛选:
from pony.orm import select # 替换成你实际要查询的key值 target_source_key = "your_target_key_here" # 构建查询 user_id_query = select(s.user.id for s in Subscription if s.source.key == target_source_key and (s.is_deleted is None or s.is_deleted == False)) # 执行查询获取结果列表 user_ids = user_id_query.list()
方式二:从User实体出发关联查询
如果你习惯从用户视角出发查询,也可以用这种链式关联的写法:
from pony.orm import select target_source_key = "your_target_key_here" user_id_query = select(u.id for u in User if u.subscriptions.source.key == target_source_key and (u.subscriptions.is_deleted is None or u.subscriptions.is_deleted == False)) user_ids = user_id_query.list()
关键逻辑说明
- 关联属性访问:Pony ORM支持像
s.source.key、u.subscriptions.source.key这样的链式访问关联实体的属性,和Django ORM的跨表查询逻辑一致,会自动帮你处理JOIN操作。 - is_deleted条件处理:因为你的
Subscription实体中is_deleted是Optional(bool, sql_default=False),所以需要同时处理NULL和False两种情况(对应SQL里的is_deleted is null or is_deleted = FALSE)。 - 查询执行:Pony的查询对象是惰性求值的,调用
.list()才会实际执行SQL并返回结果列表;如果只需要单个结果,可以用.first()。
如果还有其他疑问,随时问哦!
内容的提问来源于stack exchange,提问作者Mahdi Sorkhmiri
相关产品推荐
相关产品推荐

