在django查询中等效的SQL“LIKE”

时间:2013-08-09 06:00:05

标签: python sql django django-models django-queryset

django中这个SQL语句的等价物是什么?

SELECT * FROM table_name WHERE string LIKE pattern;

如何在django中实现此功能?我试过了

result = table.objects.filter( pattern in string )

但那没用。我该如何实现?

6 个答案:

答案 0 :(得分:169)

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

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

答案 1 :(得分:25)

包含falsetrue提到的和{icon 1}}

之类的查询

与它们一起,您可能需要具有类似行为的这些: startswithistartswithendswithiendswith

制作

SELECT ... WHERE headline LIKE '%pattern%

SELECT ... WHERE headline LIKE 'pattern%

答案 2 :(得分:8)

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

不区分大小写搜索字段中的字符串。

答案 3 :(得分:6)

这可以通过Django's custom lookups完成。我已经查询到Django-like-lookup application。安装后,将启用带有__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

答案 4 :(得分:2)

完整示例:假设我们有一个名为 DjangTable 的表,其字符串字段名称为 file_name,并且我们想要创建与 mysql 中字符串 file_name 中的空格匹配的查询等效的 Django 过滤器:

SELECT * FROM DjangTable WHERE file_name LIKE '% %' 
class DjangTable(UTModel):


    ...
    file_name = models.CharField(max_length=255, null=False)
    ...

在使用 python 的 Django 中:

pattern = ' ' # same as mysql LIKE '% %'
DjangTable.objects.filter(file_name__contains=pattern)

答案 5 :(得分:0)

为了像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语句的情况下,我将使用第一种选择。