【问题标题】:Create custom lookup in Django similar to startswith在 Django 中创建类似于startswith的自定义查找
【发布时间】:2018-02-27 23:09:57
【问题描述】:

我需要在 Django 中创建一个类似于startswith 的自定义字段查找。

内置的startswith查找工作如下:

id__startswith='abc'

所以如果 ID 字段是 'abc1' 那么它会匹配。

但是我需要创建一个看起来像这样的“从头开始包含”(cfs)查找:

id__cfs='abc12'

所以如果 ID 字段是“abc”,那么它会匹配。 基本上是 __startswith 但反过来。

我应该如何实现这个?

【问题讨论】:

标签: sql django


【解决方案1】:

事实证明,创建此自定义查找效率低下。例如,如果自定义查询如下所示:

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')

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2019-03-31
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多