【问题标题】:Django: Filtering a model that contains a field that stores RegexDjango:过滤包含存储正则表达式的字段的模型
【发布时间】: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。感谢您的回复!

标签: python regex django django-models django-filter


【解决方案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

【讨论】:

  • 只有字段可以在过滤器的左侧。
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 2016-06-01
  • 2015-12-16
  • 2018-09-21
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多