django中这个SQL语句的等价物是什么?
SELECT * FROM table_name WHERE string LIKE pattern;
如何在django中实现此功能?我试过了
result = table.objects.filter( pattern in string )
但那没用。我该如何实现?
答案 0 :(得分:169)
使用__contains
或__icontains
(不区分大小写):
result = table.objects.filter(string__contains='pattern')
答案 1 :(得分:25)
包含falsetrue提到的和{icon 1}}
之类的查询与它们一起,您可能需要具有类似行为的这些: startswith,istartswith,endswith,iendswith
制作
SELECT ... WHERE headline LIKE '%pattern%
或
SELECT ... WHERE headline LIKE 'pattern%
答案 2 :(得分:8)
result = table.objects.filter(string__icontains='pattern')
不区分大小写搜索字段中的字符串。
答案 3 :(得分:6)
这可以通过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
答案 4 :(得分:2)
完整示例:假设我们有一个名为 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)
...
在使用 python 的 Django 中:
pattern = ' ' # same as mysql LIKE '% %'
DjangTable.objects.filter(file_name__contains=pattern)
答案 5 :(得分:0)
为了像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语句的情况下,我将使用第一种选择。