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

如何在Django中创建查询集,以查看数据库中的名称是否是查询字符串的子字符串?,django,django-queryset,django-mysql,Django,Django Queryset,Django Mysql,正如标题所提到的,我正在Django中工作,并试图创建一个QuerySet来返回所有“客户”模型,这些模型的名称值是我的查询字符串的子字符串 我想要这样的东西: Customer.objects.filter(firstName__icontains=query_string) 但反过来说: Customer.objects.filter(query_string__icontains=firstName) 但这显然不起作用 我正在努力寻找关于我将如何处理这件事的任何信息 提前谢谢 编辑 我

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

我想要这样的东西:

Customer.objects.filter(firstName__icontains=query_string)
但反过来说:

Customer.objects.filter(query_string__icontains=firstName)
但这显然不起作用

我正在努力寻找关于我将如何处理这件事的任何信息

提前谢谢

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

您可以定义一个。以下是专为博士后设计的:

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)
(我还注意到他的答案中的右和左是颠倒的,所以请记住!)

最后,通过实现新的查找,如下所示:

searchResults = Customer.objects.filter(firstName__icontained_by=search_string).exclude(contract='').order_by('-dateCreated')

我想做一些类似的事情,但不幸的是,我正在做的网站是在日本。搜索日文名称时,名称之间通常没有空格,这使得该解决方案对我来说不可用。:/当然,除非我将搜索栏拆分为两个单独的输入,但如果可能的话,我会尽量避免。使用第二个答案,而不是选择的答案:DI也尝试了第二个答案。我在Brad的回答“无法将关键字查询字符串解析为字段”中遇到了相同的错误。我正在努力使这一错误正常工作。。当我把“查询字符串”放在左边时,我得到了一个“无法解析关键字”错误。对不起,我的复制和粘贴错误,我会编辑以更正。我想你的答案是最接近的!我回到这个问题,并试图编辑您的MySQL代码。参数I现在返回“LOWER(%s)LIKE LOWER(%s)”%,而不是“LOWER({rhs})LIKE“%%””,参数I现在返回“LOWER(%s)LIKE LOWER(%s)”%(rhs,lhs),如果我键入的名称与表中的名称相同,则此选项有效。我需要添加通配符,但每次我将通配符添加到这个MySQL查询时都会出现错误。我能够解决这个问题!见下面的答案。非常感谢你的帮助!