1

正如标题所提到的,我在 Django 中工作并尝试创建一个 QuerySet 来返回所有“客户”模型,这些模型的名称值是我的 query_string 的子字符串。

我想要这样的东西:

Customer.objects.filter(firstName__icontains=query_string)

但反过来:

Customer.objects.filter(query_string__icontains=firstName)

除了这显然行不通。

我正在努力寻找有关如何解决此问题的任何信息。

提前致谢。

编辑 我的预期输入将是日语 - 假名和汉字かな、カナ、汉字</p>

4

2 回答 2

3

您可以定义自定义查找。下面这个是 Postgres 特有的:

class LowerContainedBy(Lookup):
    lookup_name = 'icontained_by'

    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 f"LOWER({rhs}) LIKE '%%' || LOWER({lhs}) || '%%'", params

CharField.register_lookup(LowerContainedBy)

然后你可以这样做:

Customer.objects.filter(firstName__icontained_by=query_string)
于 2019-03-06T05:31:20.170 回答
0

感谢大家的回答!我能够通过构建@brad 的答案来解决我的问题。

我采用了他定义自定义查找的方法。它看起来很像他的,但我为 MySQL 配置了它。

class LowerContainedBy(Lookup):
lookup_name = 'icontained_by'

def as_mysql(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  "LOWER({0}) LIKE LOWER(CONCAT('%%',{1},'%%'))".format(lhs, rhs), params

Field.register_lookup(LowerContainedBy)

(我还注意到他的答案中的 rhs 和 lhs 被翻转了,所以请记住这一点!)

最后通过像这样实现新的查找:

searchResults = Customer.objects.filter(firstName__icontained_by=search_string).exclude(contract='').order_by('-dateCreated')
于 2019-03-22T02:39:33.127 回答