我想在Django中执行查询,其中左手边和右手边都是一个函数。我正在尝试实现一些复杂的查询处理(编写WFS服务器(,其中可能会出现以下情况:
SELECT * FROM table WHERE LCASE('LiteralValue') = LOWER(field2)
这是否可以使用QuerySet.filter(..)
或Q(..)
对象API?它总是期望表达式以字段开头。
是的,您可以通过其中一侧对模型对象进行注释,然后使用另一侧进行过滤:
from django.db.models.functions import Lower
QuerySet.objets.annotate(
field1_lower=Lower('field1')
).filter(
field1_lower=Lower('field2')
)
然而,对于大小写不变的匹配,您应该使用__iexact
查找[Django-doc]:
from django.db.models import F
QuerySet.objets.filter(
field1__iexact=F('field2')
)
请注意,不区分大小写的匹配是而不是与对两个操作数调用Lower
相同,然后检查两者是否匹配。事实上,排序规则定义了处理特殊字符的特定规则。例如,在德语中,ß没有小写变体。如何比较这些有特殊的规则。