Python sql";例如;django查询中的等价项

Python sql";例如;django查询中的等价项,python,sql,django,django-models,django-queryset,Python,Sql,Django,Django Models,Django Queryset,django中此SQL语句的等效项是什么 SELECT * FROM table_name WHERE string LIKE pattern; 如何在django中实现这一点?我试过了 result = table.objects.filter( pattern in string ) 但这并不奏效。我如何实现这一点 使用或(不区分大小写): result=table.objects.filter(string\uu包含class='pattern') SQL等价物是 SELECT ..

django中此SQL语句的等效项是什么

SELECT * FROM table_name WHERE string LIKE pattern;
如何在django中实现这一点?我试过了

result = table.objects.filter( pattern in string )
但这并不奏效。我如何实现这一点

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

result=table.objects.filter(string\uu包含class='pattern')
SQL等价物是

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

falsetru提到的contains和icontains会进行类似
SELECT。。。其中标题为“%pattern%”

除此之外,您可能还需要具有类似行为的: ,

制作

选择。。。其中标题如“模式%”

选择。。。其中标题类似于“%pattern”

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

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

为了保留类似sql的“%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的语句,我将使用第一个选项。

这可以通过使用。我已经把查找结果做成了一个表格。安装后,将启用带有
%
通配符的
\uuuu-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

完整示例:假设我们有一个名为DjangTable的表,其中包含字符串字段名file_name,我们希望创建Django过滤器,该过滤器等效于在mysql中匹配字符串文件_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)

对于不区分大小写的搜索,请使用uu icontains->
result=table.objects.filter(string_uuicontains='pattern')
此答案仅涵盖可能模式的子集。它不会处理像
%a%b%
@kasperd这样的模式,请尝试:
result=table.objects.filter(string\u包含class='a')。filter(string\u包含class='b')
@LS将匹配
ba
,而
像%a%b%
这样的模式不匹配。由于上述原因,此答案不完整。它还应该包括@Dmitry答案中的信息。很好,但几乎三年前就已经给出了相同的答案。这是对问题的正确答案,与公认的答案不同。