ChatGPT解决这个技术问题 Extra ChatGPT

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

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

SELECT * FROM table_name WHERE string LIKE pattern;

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

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

但这没有用。我该如何实施?


m
msanjay

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

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

SQL 等价物是

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

@Dmitri 的 answer below 涵盖了 'pattern%' 或 '%pattern' 等模式


对于不区分大小写的搜索,请使用 __icontains -> result = table.objects.filter(string__icontains='pattern')
这个答案只涵盖了可能模式的一个子集。它不能处理像 %a%b% 这样的模式。
@kasperd,试试:result = table.objects.filter(string__contains='a').filter(string__contains='b')
@LS 这将匹配 baLIKE %a%b% 不匹配。
由于上述原因,这个答案是不完整的。它还应该包括@Dmitry 的答案中的信息。
N
Nils

falsetru 提到的 contains 和 icontains 进行 SELECT ... WHERE headline LIKE '%pattern% 之类的查询

除了它们,您可能还需要具有类似行为的这些:startswithistartswithendswithiendswith

制造

SELECT ... WHERE headline LIKE 'pattern%

或者

SELECT ... WHERE headline LIKE '%pattern


P
Petr Dlouhý

这可以通过 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

这是问题的正确答案,与公认的答案不同。
这很酷,但是用户是否有可能将脏数据传递到查询中?
V
Venkat Kotra
result = table.objects.filter(string__icontains='pattern')

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


很好,但是差不多三年前已经给出了相同的答案。
R
Roderich25

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


您可能希望使替换 .*? 具有惰性匹配并且不消耗整个字符串。
O
Omer Anisfeld

完整示例:假设我们有一个名为 DjangTable 的表,其字符串字段名称为 file_name,我们希望创建 Django 过滤器,该过滤器等效于在 mysql 中匹配字符串 file_name 中的空间的查询:

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)