Python Ponyorm:按连接中的多个连接值筛选对象

Python Ponyorm:按连接中的多个连接值筛选对象,python,ponyorm,Python,Ponyorm,我正在尝试实现一种标记过滤机制,其中项目可以有任意数量的标记与其关联,并且我希望能够找到具有任何或所有请求的标记的项目 我的模式是这样的: 类项(db.Entity): tags=orm.Set(“ItemTag”) 类ItemTag(db.Entity): 项目=所需规格(项目) tag=orm.Required(str) orm.组合键(项目、标签) orm.组合键(标签、项目) 我能够使用单个标记轻松筛选现有查询: def filter\u query\u标记(查询,标记:str): 返

我正在尝试实现一种标记过滤机制,其中项目可以有任意数量的标记与其关联,并且我希望能够找到具有任何或所有请求的标记的项目

我的模式是这样的:

类项(db.Entity):
tags=orm.Set(“ItemTag”)
类ItemTag(db.Entity):
项目=所需规格(项目)
tag=orm.Required(str)
orm.组合键(项目、标签)
orm.组合键(标签、项目)
我能够使用单个标记轻松筛选现有查询:

def filter\u query\u标记(查询,标记:str):
返回orm.select(如果t.key==tag,则在i.tags中查询t时,i代表i)
我可以轻松找到带有任何标签的物品:

def filter\u query\u any\u标记(查询,标记:typing.Union(set,list,tuple)):
返回orm.select(如果t.key in tags,则查询t in i.tags中的i为i)
但是,试图构建一个查找所有标记的查询会抛出一个错误:

def filter\u query\u all\u标记(查询,标记:typing.Union(set,list,tuple)):
对于标记中的标记:
query=orm.select(如果t.key==tag,则在i.tags中查询t时,i代表i)
返回查询
结果:

文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/core.py”,第5562行,选择
返回make\u query(args,frame\u depth=cut\u traceback\u depth+1)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/core.py”,第5558行,在make_query中
返回查询(code\u键、tree.code、全局、局部、单元格、左联合)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/core.py”,第5717行,在__
translator=translator\u cls(树\u副本,无,代码\u键,筛选器\u num,提取器,变量,vartypes.copy(),left\u join=left\u join)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第222行,在__
init(树、父\u转换器、代码\u键、筛选器\u num、提取器、变量、变量类型、左\u连接、优化)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第396行,在init中
tableref=translator.sqlquery.add\u tableref(名称\u路径、父\u tableref、属性)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第1211行,在add_tableref中
断言名称\u路径不在sqlquery.tablerefs中
断言错误
问题大概是将多个连接名映射到同一个表时出现问题,这可能是ponyorm中的一个bug。然而,我怀疑可能有更好的方法来构建查询,而不必首先进行多个连接和筛选

我尝试使用
orm.left\u join
而不是
orm.select
,如下所示:

def filter\u query\u all\u标记(查询,标记:typing.Union(set,list,tuple)):
对于标记中的标记:
query=orm.left\u join(如果t.key==tag,则在i.tags中查询t时,i代表i)
返回查询
在这种情况下,我可以同时过滤两个标记,但如果添加第三个标记,我会得到:

文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/core.py”,第5566行,左侧
返回make\u query(args,frame\u depth=cut\u traceback\u depth+1,left\u join=True)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/core.py”,第5558行,在make_query中
返回查询(code\u键、tree.code、全局、局部、单元格、左联合)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/core.py”,第5717行,在__
translator=translator\u cls(树\u副本,无,代码\u键,筛选器\u num,提取器,变量,vartypes.copy(),left\u join=left\u join)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第222行,在__
init(树、父\u转换器、代码\u键、筛选器\u num、提取器、变量、变量类型、左\u连接、优化)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第343行,在init中
名称,try_extend_prev_query=not i)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第598行,正在查询中
子查询\u ast=prev\u转换器。构造\u子查询\u ast(prev\u限制,prev\u偏移,别名=别名)
文件“/Users/fluffy/.local/share/virtualenvs/Publ-FUB3ZG92/lib/python3.7/site packages/pony/orm/sqltranslation.py”,第625行,在构造子查询中
断言非星形和len(别名)=len(选择ast)-1
断言错误
ponyorm中是否有一个原始的或惯用的表达式,允许我指定集合的所有值必须出现在任何给定的
项的
项标记
值中?

这似乎有效:

def filter\u query\u all\u标记(查询,标记:typing.Union(set,list,tuple)):
对于标记中的标记:
query=query.filter(lambda i:orm.exists(如果t.key==tag,则t代表i.tags中的t))
返回查询

然而,这似乎可能更好。

AssertionError表示您达到了意外行为。你介意为这个案子提出一个问题吗@萨萨埃罗开张了,谢谢你的提醒