我已尝试使用'%%'
和'%'
,但这些都不适用于以下情况。
查询的输出是:
UPPER('field') LIKE UPPER('string')
但我希望输出为:
UPPER('field') LIKE UPPER('%string%')
答案 0 :(得分:2)
您正尝试在同一查询中合并查找和Transform。你一次只能做一个。这是因为Lookup automatically adds parentheses around lhs_params
and rhs_params
。
当您尝试return 'UPPER(%s) LIKE UPPER(%%%s%%)' % (lhs, rhs), params
时,这就是导致不支持的字符错误的原因。
您需要构建Bilateral Transformer以将两边与查找函数分开转换为大写。
您真正想要的是使用结合Transform
的文档中的__contains
替换LIKE
查找:
from django.db.models import Transform
class UpperCase(Transform):
lookup_name = 'upper'
function = 'UPPER'
bilateral = True
您的查询将是:
YourObject.objects.filter(yourvalue__upper__contains="something")
答案 1 :(得分:0)
您可以覆盖process_rhs
方法并修改其中的值:
class MyCustomLookup(Lookup):
lookup_name = 'custom_lookuptest'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return 'UPPER(%s) LIKE UPPER(%s)' % (lhs, rhs), params
def process_rhs(self, compiler, connection):
value = '%%%s%%' % self.rhs
if self.bilateral_transforms:
if self.rhs_is_direct_value():
value = Value(value, output_field=self.lhs.output_field)
value = self.apply_bilateral_transforms(value)
value = value.resolve_expression(compiler.query)
if hasattr(value, 'get_compiler'):
value = value.get_compiler(connection=connection)
if hasattr(value, 'as_sql'):
sql, params = compiler.compile(value)
return '(' + sql + ')', params
if hasattr(value, '_as_sql'):
sql, params = value._as_sql(connection=connection)
return '(' + sql + ')', params
else:
return self.get_db_prep_lookup(value, connection)