作为标题所提到的,我在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')