使用any()
方法,我能够像这样过滤查询:
session.query(Result).filter(Result.related_images.any(url='result1_1512149119.jpg'))
这是针对与Result
类相关的图像过滤的,该类别与由协会对象ResultImages
定义的Image
对象有关系,因此session.query(Result.related_images).all()
将返回所有已指定为与Result
条目相关的图像。
从上方进行第一次查询时,我会得到以下输出:
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_1512149091.jpg
子字符串过滤的查询也会返回result1_1512149094.jpg
。对于我的特殊用途,这是理想的选择,但我不明白为什么它以这种方式工作。例如,我希望通过.any('result1')
进行过滤也会返回result1
映像的完整列表,但它没有返回。
我最终想做的是使用Regex表达式通过关联对象的属性值过滤,以便我可以进行.any(url={{REGEX EXPRESSION}})
。这是可能的吗?
我最终想做的是使用Regex表达式通过关联对象的属性值过滤,以便我可以进行
.any(url={{REGEX EXPRESSION}})
。这是可能的吗?
当然是。您可以将任何SQL表达式传递给any()
作为标准。例如,使用startswith()
,contains()
,like()
本身或您有什么样的类似表达式:
session.query(Result).
filter(Result.related_images.any(
Image.url.startswith('result1')))
使用RegeXP通常是特定于DB的,并且您在问题中省略了一些信息,因此我尝试在此答案中避免使用。但是您将以与此处的类似表达相同的方式使用它。