Django高级LIKE过滤

时间:2018-10-31 15:34:02

标签: django django-rest-framework sql-like

因此,我试图找到一种使用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语句如下:

  1. 包含:name LIKE '%something%'
  2. 开始于:name LIKE 'something%'
  3. 结尾为:name LIKE '%something'

所以我需要的那个丢失了:

  1. 像:name LIKE 'group[%].car[%]'

我也在使用Django Rest Framework编写我的API端点,并且在这里我们发现可以使用:

  1. 包含:name__contains = something
  2. 开始于:name__startswith = something
  3. 结尾为:name__endswith = something

这里也是,我需要的一个丢失了:

  1. 像:name__like 'group[%].car[%]'

当然我知道我可以使用raw()方法通过Django编写原始sql查询,但是如果没有更好的解决方案,我想使用此选项,因为:

  1. 我需要确保自定义设置安全
  2. 我需要将自定义扩展到DRF

有人能想到一种方法来帮助我解决这个问题吗,以配合Django和Django Rest Framework的流程?

1 个答案:

答案 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 ,而不会。