python Django ORM查询的SQL '' LIKE '等价物是什么?

i5desfxk  于 2023-03-21  发布在  Python
关注(0)|答案(6)|浏览(160)

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

SELECT * FROM table_name WHERE string LIKE pattern;

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

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

但这并不起作用。我如何实现这一点?

cunj1qz1

cunj1qz11#

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

在Django中使用Python,它将是:

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

fivyi3re2#

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

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

SQL的等效项是

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

@Dmitri的answer below涵盖了像'pattern%'或'%pattern'这样的模式

js5cn81o

js5cn81o3#

falsetru提到的contains和icontains可以进行像SELECT ... WHERE headline LIKE '%pattern%这样的查询
沿着它们之外,您可能还需要具有类似行为的这些:开始于,开始于,结束于,结束于
制作
SELECT ... WHERE headline LIKE 'pattern%

SELECT ... WHERE headline LIKE '%pattern

ljsrvy3e

ljsrvy3e4#

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

trnvg8h35#

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

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

iyzzxitl

iyzzxitl6#

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

相关问题