Django查询中的“ LIKE”等效SQL


Answers:


200

使用__contains__icontains(不区分大小写):

result = table.objects.filter(string__contains='pattern')

SQL等效为

SELECT ... WHERE string LIKE '%pattern%';

22
对于不区分大小写的搜索,请使用__icontains- >result = table.objects.filter(string__icontains='pattern')
Hitesh Garg,

13
该答案仅涵盖可能模式的子集。它不会处理类似的模式%a%b%
kasperd '16

@kasperd,尝试:result = table.objects.filter(string__contains='a').filter(string__contains='b')
LS

1
@LS会匹配baLIKE %a%b%而不会。
卡巴斯德(Kasperd),

2
由于上述原因,此答案不完整。它还应在@Dmitry的答案中包含信息。
medley56



3

为了像sql LIKE'%pattern%'语句中那样保留单词的顺序,我使用了iregex,例如:

qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))

字符串方法是不可变的,因此您的模式变量不会更改,并且使用。*时,您会寻找0个或多个出现的任何字符,但要换行。

通过使用以下代码遍历模式词:

qs = table.objects
for word in pattern.split(' '):
    qs = qs.filter(string__icontains=word)

对于某些可能有用的人,将不会保留模式中单词的顺序,但是在尝试模仿sql like语句的情况下,我将使用第一个选项。


2

这可以通过Django的自定义查询来完成。我已经将查询转换为Django式lookup应用程序。安装后__like,使用%和查找_将启用通配符。

该应用程序中所有必需的代码是:

from django.db.models import Lookup
from django.db.models.fields import Field


@Field.register_lookup
class Like(Lookup):
    lookup_name = 'like'

    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 '%s LIKE %s' % (lhs, rhs), params
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.