Python 使用SQLAlchemy,如何通过关联对象属性和正则表达式进行过滤?

Python 使用SQLAlchemy,如何通过关联对象属性和正则表达式进行过滤?,python,sqlalchemy,many-to-many,model-associations,Python,Sqlalchemy,Many To Many,Model Associations,使用,我可以过滤如下查询: session.query(Result).filter(Result.related_images.any(url='result1_1512149119.jpg')) 这是筛选与结果类相关的图像,该类与关联对象ResultImages定义的图像对象有关系,例如session.query(Result.related_images).all()将返回指定为与结果项相关的所有图像 从上面进行第一次查询时,我得到以下输出: result1_1512149091.jpg

使用,我可以过滤如下查询:

session.query(Result).filter(Result.related_images.any(url='result1_1512149119.jpg'))
这是筛选与
结果
类相关的图像,该类与关联对象
ResultImages
定义的
图像
对象有关系,例如
session.query(Result.related_images).all()
将返回指定为与
结果
项相关的所有图像

从上面进行第一次查询时,我得到以下输出:

result1_1512149091.jpg
result1_1512149094.jpg
result1_1512149097.jpg
result1_1512149100.jpg
result1_1512149103.jpg
result1_1512149105.jpg
result1_1512149109.jpg
result1_1512149111.jpg
result1_1512149113.jpg
result1_1512149117.jpg
result1_1512149119.jpg
result1_1512149122.jpg
result1_1512149125.jpg
result1_1512149128.jpg
在我的数据库中,有许多图像用于许多结果,因此以下查询:

session.query(Result).filter(Result.related_images.any(url='result2_1512149119.jpg'))
将返回以下数据:

result2_1512149091.jpg
result2_1512149094.jpg
result2_1512149097.jpg
result2_1512149100.jpg
result2_1512149103.jpg
result2_1512149105.jpg
result2_1512149109.jpg
result2_1512149111.jpg
result2_1512149113.jpg
result2_1512149117.jpg
result2_1512149119.jpg
result2_1512149122.jpg
result2_1512149125.jpg
result2_1512149128.jpg
我已经阅读了与
any()
函数相关的文档,但仍然不清楚如何利用它来实现更精细的方法(或者是否可能)。例如,对于我正在进行的查询类型,我只能预先知道文件名的
result1
子字符串

我不明白为什么通过
result1\u 1512149091.jpg
子字符串过滤的查询也会返回
result1\u 1512149094.jpg
。对于我的特殊用途,这是理想的,但我不明白为什么它会以这种方式工作。例如,我希望通过
进行过滤。任何('result1')
也将返回
result1
图像的完整列表,但它不返回任何内容

我最终想做的是使用正则表达式按关联对象的属性值进行过滤,这样我就可以执行
.any(url={{regex expression}})
。这有可能吗

我最终想做的是使用正则表达式按关联对象的属性值进行过滤,这样我就可以执行
.any(url={{regex expression}})
。这有可能吗

当然是。您可以将任何SQL表达式传递给as标准。例如,一个类似的表达式,使用、自身或您拥有的内容:

session.query(Result).\
    filter(Result.related_images.any(
        Image.url.startswith('result1')))

使用regexp通常有点特定于DB,并且您在问题中省略了这一点信息,所以我在这个答案中尽量避免使用它。但是您可以使用与这里类似的表达方式。

太棒了,谢谢!使用
regex
只是我的想法,当然不是要求。我想你的方法正是我想要实现的。