如何将%放在字符串中

时间:2016-12-16 14:23:05

标签: mysql

我已尝试使用'%%''%',但这些都不适用于以下情况。

查询的输出是:

UPPER('field') LIKE UPPER('string')

但我希望输出为:

UPPER('field') LIKE UPPER('%string%')

2 个答案:

答案 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)