如何在 Django 中创建一个 QuerySet 以查看数据库中的名称是否是我的查询字符串的子字符串?

How do I make a QuerySet in Django to see if a name in the database is a substring of my query string?

如标题所述,我在 Django 中工作并尝试为 return 所有 "Customer" 模型创建一个查询集,这些模型的名称值是我的 query_string 的子字符串.

我想要这样的东西:

Customer.objects.filter(firstName__icontains=query_string)

但反过来说:

Customer.objects.filter(query_string__icontains=firstName)

除了那显然行不通。

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

提前致谢。

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

你可以定义一个custom lookup。下面这个是 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)

感谢大家的解答! 我能够通过建立@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')