Django,如何使用过滤器检查字符串字段是不是是参数的子字符串?

Posted

技术标签:

【中文标题】Django,如何使用过滤器检查字符串字段是不是是参数的子字符串?【英文标题】:Django, how to use filter to check if string field is a substring of a parameter?Django,如何使用过滤器检查字符串字段是否是参数的子字符串? 【发布时间】:2020-05-20 10:47:28 【问题描述】:

我在 Django 中有一个这样的模型 -

class City:
    name = models.CharField(max_length=255)

现在下面的查询可以过滤参数字符串是否是城市模型中名称字段的子字符串--

results = City.objects.filter(name_icontains=<some_string>).all()

假设城市表的数据库中的其中一行具有 name = "new york city",因此如果将查询字符串指定为 "new york",则上述过滤器查询将与之匹配,因为 "new york" 是包含在“纽约市”中。

现在在阅读了这个问题的答案之后——

Django, how to use filter to check if string field is contained in parameter

我可以通过将查询字符串分解成单词然后对每个单词应用过滤查询来解决这个问题。但是,如果我的查询字符串不是两个单独的单词而是一个长单词,如何解决这个问题。这是一个例子 -

假设 city 表的一行包含名称为“newyork”,我的查询字符串是“newyorkcity”,现在我不能将“newyorkcity”查询字符串分成单独的单词并应用单独的过滤。那么我该如何解决这个问题,以便当我搜索匹配名称为“newyorkcity”的行时,它应该返回包含名称为“newyork”的行?

我希望我的解释很清楚。

谢谢

【问题讨论】:

【参考方案1】:

你能试试这个查询吗?

City.objects.annotate(
    string=Value('newyorkcity', output_field=CharField())
).filter(string__icontains=F('name'))

【讨论】:

在您提到的查询中包含output_field=CharField() 会产生此错误CharField object has no attribute 'get_lookup',但删除 output_field 参数后查询工作正常。

以上是关于Django,如何使用过滤器检查字符串字段是不是是参数的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 查询检查数据库字段的所有值是不是相同

Django:如何检查自定义小部件定义中是不是存在字段错误?

Django如何过滤多对多字段中的对象,而不是原始查询集

是否可以通过检查它们的交集是否为空来过滤 django 多对多 QuerySet 字段?

如何使用附加过滤的相关对象作为 Django 中的字段来获取结果?

Django检查字段是不是为空?