因此,我试图找到一种使用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]'
我想选择所有看起来像group [x] .car [y]的元素。
要在SQL中进行查询,我会这样做:
SELECT * FROM elements WHERE name LIKE 'group[%].car[%]'
现在,通过阅读Django文档here,我看到只有预构建的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查询,但是如果没有更好的解决方案,我想使用此选项,因为:
有人能想到一种方法来帮助我解决这个问题吗,以配合Django和Django Rest Framework的流程?
答案 0 :(得分:3)
为此,您可以使用regular expression (regex) [wiki]和__iregex
lookup [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*\]$')
由于某些规范有些“复杂”,因此最好先对您的正则表达式进行测试,例如,使用regex101,您可以查看将要匹配的name
,而不会。