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 )
但这没有用。我该如何实施?
使用__contains
or __icontains
(不区分大小写):
result = table.objects.filter(string__contains='pattern')
SQL 等价物是
SELECT ... WHERE string LIKE '%pattern%';
falsetru 提到的 contains 和 icontains 进行如下查询SELECT ... WHERE headline LIKE '%pattern%
与它们一起,您可能需要具有类似行为的这些: startswith、istartswith、endswith、iendswith
制造
SELECT ... WHERE headline LIKE 'pattern%
或者
SELECT ... WHERE headline LIKE '%pattern
这可以通过Django 的自定义查找来完成。我已将查找放入类似Django 的查找应用程序中。安装后,将启用带有和通配符的__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')
在字段中搜索不区分大小写的字符串。
为了保持 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 语句的情况下,我将使用第一个选项。
完整示例:假设我们有一个名为 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)