因此,我正试图找到一种在Django中使用LIKE语句执行高级过滤器的好方法。
假设我在一个名为elements
:的表中有以下记录
id = 1, name = 'group[1].car[8]'
id = 2, name = 'group[1].car[9]'
id = 3, name = 'group[1].truck[1]'
id = 4, name = 'group[1].car[10]'
id = 4, name = 'group[1].carVendor[1]'
我想选择所有看起来像组[x].car[y].的元素
要在SQL中查询此项,我将执行以下操作:
SELECT * FROM elements WHERE name LIKE 'group[%].car[%]'
现在,通过阅读这里的Django文档,我发现唯一预构建的LIKE语句如下:
- 包含:
name LIKE '%something%'
- 启动开关:
name LIKE 'something%'
- 端开关:
name LIKE '%something'
所以我需要的东西不见了:
- 类普通:
name LIKE 'group[%].car[%]'
我也在使用Django Rest Framework来编写我的API端点,在这里我们也找到了使用的可能性:
- 包含:
name__contains = something
- 启动开关:
name__startswith = something
- 端开关:
name__endswith = something
所以在这里,我需要的是丢失的:
- 类普通:
name__like 'group[%].car[%]'
当然,我知道我可以使用raw()
方法通过Django编写原始sql查询,但如果没有更好的解决方案,我想使用这个选项,因为:
- 我需要确保我的定制是安全的
- 我需要将定制扩展到DRF
有人能想出一种方法来帮助我解决这个问题吗?
您可以使用正则表达式(regex([wiki],通过__iregex
查找[Django-doc]:
Elements.objects.filter(name__iregex=r'^group[.*].car[.*]$')
如果在方括号之间,只允许数字,我们可以使用使其更具体
# only digits between the square brackets
Elements.objects.filter(name__iregex=r'^group[d*].car[d*]$')
由于有些规范有点"复杂",因此最好先测试您的regex,例如使用regex101,您可以查看哪些name
s将匹配,哪些将不匹配。