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.extraSysTeam.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:过滤包含存储正则表达式的字段的模型的主要内容,如果未能解决你的问题,请参考以下文章

包含正斜杠的 Django URL 正则表达式

使用可变数量的参数过滤多个 Django 模型字段

字段中的 Django 正则表达式

如何使用 django F 表达式仅过滤日期时间字段的日期

尝试使用 django 过滤器为给定模型中的所有字段创建一般搜索

Django数据模型--字段整理