Django:过滤包含存储正则表达式的字段的模型
Posted
技术标签:
【中文标题】Django:过滤包含存储正则表达式的字段的模型【英文标题】:Django: Filtering a model that contains a field that stores Regex 【发布时间】:2014-09-17 18:46:29 【问题描述】:我有一个存储 REGEX 模式的字段,我试图通过将它与传入的名为主机名的变量进行比较来过滤它所在的模型。 (例如:这里我只是硬编码了正则表达式。
Sys_team.objects.filter(hostname= r'^.*\.amgr\..*')
我遇到了这个错误:
FieldError: Cannot resolve keyword 'hostname' into field. Choices are: alert, id, pattern, pub_date, sys_team
主机名格式为:xxx.amgr.xxx
这是否意味着只有字段可以进入过滤器的左侧?如果是这样,是否有另一种方法可以将两者与左侧的 REGEX 模式进行比较。重申一下,主机名不是一个字段。
【问题讨论】:
在左侧,是的,只有您正在查询的模型中的字段或相关模型中的字段。在右侧,您可以使用django.models.F
来引用另一个字段。您还可以使用 SysTeam.objects.extra
或 SysTeam.objects.raw
以使用原始 SQL 进行自定义查询。
是的,原始 SQL 是一种可能性,但我希望保留它 Django-y。感谢您的回复!
【参考方案1】:
使用 Django __contains
方法。
所以对于您的查询:
Sys_team.objects.filter(hostname__contains='.amgr.')
__contains
是 Django ORM 等效于 SQL 的 LIKE
关键字。
这是文档:
https://docs.djangoproject.com/en/dev/topics/db/queries/#escaping-percent-signs-and-underscores-in-like-statements
【讨论】:
只有字段可以在过滤器的左侧。以上是关于Django:过滤包含存储正则表达式的字段的模型的主要内容,如果未能解决你的问题,请参考以下文章