我需要在Django中创建一个与startswith类似的自定义字段查找。
内置的带查找的built是这样工作的:
id__startswith='abc'
因此,如果ID字段是'abc1‘,那么它将匹配。
但是,我需要创建一个'contained from start‘(cfs)查找,如下所示:
id__cfs='abc12'
因此,如果ID字段是'abc‘,那么它将匹配。基本上是__startswith,反之亦然。
我应该如何实现它?
发布于 2018-04-18 06:24:24
事实证明,创建此自定义查找的效率很低。例如,如果自定义查询如下所示:
id__custom='abc12'
然后,sql查询将如下所示:
WHERE 'abc12' LIKE id||%
但是,这个LIKE查询将非常慢,因为它不能使用任何索引。每一条记录都必须与“ABC12”进行比较。因此,实现相同目标的最佳方法是将字符串划分为多个子字符串,并将它们存储在列表中。然后,您可以使用__in查找来搜索这些内容。
例如,如果要查找至少包含字符串一半的匹配,可以创建三个子字符串并搜索它们。通过使用__in查找,您的查询速度会快得多,因为您可以使用现有的索引。结果将如下所示:
substrings = ['abc', 'abc1', 'abc12']
query = Item.objects.filter(id__in=substrings).values('id', 'manufacturer')
https://stackoverflow.com/questions/49019446
复制