django中的此SQL语句等效于什么?
SELECT * FROM table_name WHERE string LIKE pattern;
如何在Django中实现呢?我试过了
result = table.objects.filter( pattern in string )
但这没有用。我该如何实施?
django中的此SQL语句等效于什么?
SELECT * FROM table_name WHERE string LIKE pattern;
如何在Django中实现呢?我试过了
result = table.objects.filter( pattern in string )
但这没有用。我该如何实施?
Answers:
使用__contains
或__icontains
(不区分大小写):
result = table.objects.filter(string__contains='pattern')
SQL等效为
SELECT ... WHERE string LIKE '%pattern%';
%a%b%
。
result = table.objects.filter(string__contains='a').filter(string__contains='b')
ba
,LIKE %a%b%
而不会。
由falsetru提及的包含和icontains使查询类似 SELECT ... WHERE headline LIKE '%pattern%
与它们一起,您可能需要具有类似行为的这些: startswith,istartswith,endswith,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的自定义查询来完成。我已经将查询转换为Django式lookup应用程序。安装后__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
result = table.objects.filter(string__icontains='pattern')