【问题标题】:How to make a query using a database function with Django ORM?如何使用带有 Django ORM 的数据库函数进行查询?
【发布时间】:2016-11-17 11:43:24
【问题描述】:

我想在 Django ORM 中使用像这样的 WHERE 子句查询数据库:

WHERE LOWER(col_name) = %s

WHERE LOWER(col_name) = LOWER(%s)

如何使用 QuerySet API 做到这一点?

【问题讨论】:

  • 为什么不直接使用__iexact 进行不区分大小写的比较?
  • 我在LOWER(col_name)上有一个索引。

标签: python django postgresql orm


【解决方案1】:

您可以使用extra 使用 sql 函数添加自定义 where 条件:

Author.objects.extra(where=["lower(name) = lower(%s)"], params=['Fabio'])

您希望使用参数而不是直接在查询中嵌入值,以避免通过让 Django 为您转义参数来避免 SQL 注入。

如果您可以避免在传递的参数上使用 sql LOWER 函数(在我的示例中为“Fabio”),那么您可以改用 annotate

Author.objects.annotate(name_lower=Lower('name')).filter(name_lower=your_name.lower())

请注意,your_name.lower() 使用的是 python lower 函数,而不是 sql 函数。

我找不到将注释与F()Lower() (from django.db.models.functions import Lower) 一起使用以将Lower 应用于您的自定义输入而不是另一个字段的方法。

【讨论】:

  • 是否可以从SELECT 的字段中排除name_lower
  • @planetp 你是什么意思?如果您使用extra 示例,则不应将任何其他字段添加到查询的 SELECT 部分。 Annotate 会选择该字段
  • 是的,extra() 为我工作。 annotate() 将字段添加到不想要的 SELECT 列表中(我只想过滤表达式,而不是选择它)。
猜你喜欢
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2018-05-21
  • 2015-01-06
  • 1970-01-01
  • 2019-12-31
相关资源
最近更新 更多