如何过滤查询的计算列并同时保留映射的实体

How to filter on calculated column of a query and meanwhile preserve mapped entities

我有一个查询,其中 select 是实体 A 和一些计算字段

q = session.query(Recipe,func.avg(Recipe.somefield).join(.....)

然后我使用我 select 的方式假设我可以用 "Recipe" 字符串下标结果:

for entry in q.all():
   recipe=entry.Recipe # Access KeyedTuple by Recipe attribute
   ...

现在我需要将我的查询包装在一个额外的 select 中,比如按计算字段 AVG 过滤:

q=q.subquery(); 
q=session.query(q).filter(q.c.avg_1 > 1)

现在我无法访问 entry.Recipe! 有没有办法让 SQLAlchemy 使查询适应封闭的查询,比如 aliased(adapt_on_names=True) orselect_from_entity()`? 我尝试使用那些但出现错误

正如 Michael Bayer 在相关的 Google 组帖子中提到的那样,这种适应已经通过 Query.from_self() 方法完成。我的问题是,在这种情况下,我不知道如何引用我想过滤的列

这是因为计算出来的,没有table可以参考!

我可能会求助于使用文字(.filter('avg_1>10')),但我更愿意留在更多的 ORM 风格

所以,这就是我想出的 - 一个显式列表达式

row_number_column = func.row_number().over(
    partition_by=Recipe.id
).label('row_number')

query = query.add_column(
    row_number_column
)
query = query.from_self().filter(row_number_column == 1)