django - 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]'
我想选择所有看起来像 group[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
任何人都可以想出一种方法来帮助我解决这个问题,同时使用 Django 和 Django Rest Framework?
解决方案
您可以为此使用正则表达式 (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*\]$')
由于某些规范有点“复杂”,因此最好先测试您的正则表达式,例如使用regex101您可以查看哪些name
s 将匹配,哪些不匹配。
推荐阅读
- reactjs - 如何在 React Native 中的卡片图像上叠加文本?
- powershell - 如何提高powershell中的调试速度
- python - 如何将子列表的分数分配给单词并创建新字典
- postgresql - PostGIS ST_SnapToGrid 仅部分工作
- c - 如何将 SHA-256 crypt 与 musl 一起使用?
- sql - SSRS 用户拒绝不编辑门户网站页面的权限
- rdp - 当已经以 mstsc /span 登录时,如何让 rdp 最大化到我的一个显示器?
- angular - Angular 8 未使用 ng2-adsense 构建
- visualization - 如何可视化 Kibana 中两个聚合结果之间的划分(指标)
- node.js - Mikrotik 不会将用户密码属性发送到半径应用程序