在django中,这个SQL语句的等价物是什么?
SELECT * FROM table_name WHERE string LIKE pattern;
我如何在django中实现这个呢?我试过了
result = table.objects.filter( pattern in string )
但这并不起作用。我如何实现这一点?
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)
fivyi3re2#
使用__contains或__icontains(不区分大小写):
__contains
__icontains
result = table.objects.filter(string__contains='pattern')
SQL的等效项是
SELECT ... WHERE string LIKE '%pattern%';
@Dmitri的answer below涵盖了像'pattern%'或'%pattern'这样的模式
js5cn81o3#
falsetru提到的contains和icontains可以进行像SELECT ... WHERE headline LIKE '%pattern%这样的查询沿着它们之外,您可能还需要具有类似行为的这些:开始于,开始于,结束于,结束于制作SELECT ... WHERE headline LIKE 'pattern%或SELECT ... WHERE headline LIKE '%pattern
SELECT ... WHERE headline LIKE '%pattern%
SELECT ... WHERE headline LIKE 'pattern%
SELECT ... WHERE headline LIKE '%pattern
ljsrvy3e4#
这可以通过Django's custom lookups来完成。我已经将查找设置为Django-like-lookup application。安装后,将启用带有%和_通配符的__like查找。应用程序中所有必要的代码是:
%
_
__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
trnvg8h35#
result = table.objects.filter(string__icontains='pattern')
不区分大小写搜索字段中的字符串。
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语句的情况下,我将使用第一个选项。
6条答案
按热度按时间cunj1qz11#
完整示例:假设我们有一个名为DjangTable的表,它的字段名为file_name,我们想创建一个Django过滤器,它等价于mysql中匹配file_name中空格的查询:
在Django中使用Python,它将是:
fivyi3re2#
使用
__contains
或__icontains
(不区分大小写):SQL的等效项是
@Dmitri的answer below涵盖了像'pattern%'或'%pattern'这样的模式
js5cn81o3#
falsetru提到的contains和icontains可以进行像
SELECT ... WHERE headline LIKE '%pattern%
这样的查询沿着它们之外,您可能还需要具有类似行为的这些:开始于,开始于,结束于,结束于
制作
SELECT ... WHERE headline LIKE 'pattern%
或
SELECT ... WHERE headline LIKE '%pattern
ljsrvy3e4#
这可以通过Django's custom lookups来完成。我已经将查找设置为Django-like-lookup application。安装后,将启用带有
%
和_
通配符的__like
查找。应用程序中所有必要的代码是:
trnvg8h35#
不区分大小写搜索字段中的字符串。
iyzzxitl6#
为了保持sql LIKE '%pattern%'语句中单词的顺序,我使用iregex,例如:
字符串方法是不可变的,所以你的模式变量不会改变,使用.* 你将寻找0个或更多的字符出现,但断线。
通过使用以下代码来迭代模式单词:
在你的模式中单词的顺序将不会被保留,对于一些人来说,这可能是可行的,但是在试图模仿sql like语句的情况下,我将使用第一个选项。