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



作为标题所提到的,我在django工作,并试图制作一个QuerySet,以返回所有具有名称值的"客户"模型,该模型具有我的query_string的子字符串。

我想要这样的东西:

Customer.objects.filter(firstName__icontains=query_string)

但反向:

Customer.objects.filter(query_string__icontains=firstName)

除了显然不起作用。

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

预先感谢。

编辑我的预期输入将是日语-Kana和Kanjiかな汉字

您可以定义自定义查找。下面的这是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')

相关内容

  • 没有找到相关文章

最新更新