如何在 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')
如标题所述,我在 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')