You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键逻辑说明

  1. 关联属性访问:Pony ORM支持像s.source.key、u.subscriptions.source.key这样的链式访问关联实体的属性,和Django ORM的跨表查询逻辑一致,会自动帮你处理JOIN操作。
  2. is_deleted条件处理:因为你的Subscription实体中is_deleted是Optional(bool, sql_default=False),所以需要同时处理NULL和False两种情况(对应SQL里的is_deleted is null or is_deleted = FALSE)。
  3. 查询执行:Pony的查询对象是惰性求值的,调用.list()才会实际执行SQL并返回结果列表;如果只需要单个结果,可以用.first()。

如果还有其他疑问,随时问哦!

内容的提问来源于stack exchange,提问作者Mahdi Sorkhmiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:33:16