Django 查询中的 sql“ LIKE”等价物

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

SELECT * FROM table_name WHERE string LIKE pattern;

我如何在 django 中实现这个? 我试过了

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

但是没有成功,我该怎么实现呢?

138226 次浏览

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

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

SQL 等价物是

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

@ Dmitri 的 回答如下涵盖了“模式%”或“% 模式”等模式

包含和图标所提到的错误使像 SELECT ... WHERE headline LIKE '%pattern%查询

除此之外,你可能还需要这些行为相似的人: 开始结束,< a href = “ https://docs.djangoproject.com/en/4.0/ref/model/querysets/# iendswith”rel = “ nofollow noReferrer”> iendswith 开始

制造

SELECT ... WHERE headline LIKE 'pattern%

或者

SELECT ... WHERE headline LIKE '%pattern

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

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

为了保持 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 语句的情况下,我将使用第一个选项。

这可以用 姜戈的定制查找来完成。我已经查到了一个 类似 Django 的查找应用程序。在安装它之后,将启用带有 %_通配符的 __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

完整示例: 假设我们有一个名为 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)
...

在 Django 中使用 python 它将是:

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