我可以在 LHS 和 RHS 都是函数的 Django 中执行查询吗?

Can I perform queries in Django where both the LHS and RHS are a function?

我想在 Django 中执行查询,其中左侧和右侧都是一个函数。我正在尝试实现一些复杂的查询处理(编写 WFS 服务器),可能会出现以下情况:

SELECT * FROM table WHERE LCASE('LiteralValue') = LOWER(field2)

这可以使用 QuerySet.filter(..)Q(..) 对象 API 吗? 它总是期望表达式以字段开头。

是的,你用其中一侧标注模型对象,然后用另一侧过滤:

from django.db.models.functions import Lower

QuerySet.objets.annotate(
    <b>field1_lower=Lower('field1')</b>
).filter(
    <b>field1_lower=Lower('field2')</b>
)

对于大小写不变的匹配,您应该使用 __iexact lookup [Django-doc]:

from django.db.models import F

QuerySet.objets.filter(
    <b>field1__iexact=F('field2')</b>
)

注意不区分大小写的匹配不是 等同于对两个操作数调用Lower,然后检查两者是否匹配。实际上,排序规则定义了处理特殊字符的特定规则。例如在德语中 ß 没有小写变体。有特殊的规则如何比较这些。