Django高级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]'

我想选择所有看起来像组[x].car[y].的元素

要在SQL中查询此项,我将执行以下操作:

SELECT * FROM elements WHERE name LIKE 'group[%].car[%]'

现在,通过阅读这里的Django文档,我发现唯一预构建的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

有人能想出一种方法来帮助我解决这个问题吗?

您可以使用正则表达式(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,您可以查看哪些names将匹配,哪些将不匹配。

相关内容

  • 没有找到相关文章

最新更新