djangoクエリで同等のsql“ LIKE”


108

ジャンゴのこのSQL文に相当するものは何ですか?

SELECT * FROM table_name WHERE string LIKE pattern;

djangoでこれを実装するにはどうすればよいですか?私は試した

result = table.objects.filter( pattern in string )

しかし、それはうまくいきませんでした。これを実装するにはどうすればよいですか?

回答:


200

__containsまたは__icontains(大文字と小文字を区別しない)を使用します。

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

同等のSQLは

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

22
そして、大文字小文字を区別しない検索の使用のための__icontains - >result = table.objects.filter(string__icontains='pattern')
Hiteshガーグ

13
この回答は、可能なパターンのサブセットのみをカバーしています。それはのようなパターンを処理しません%a%b%
kasperd

@kasperd、試してください:result = table.objects.filter(string__contains='a').filter(string__contains='b')
LS

1
@LSそれは一致baLIKE %a%b%ないでしょう。
kasperd

2
上記の理由により、この回答は不完全です。@Dmitryの回答に情報を含める必要もあります。
medley56


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

フィールド内の文字列の大文字と小文字を区別しない検索。


2
いいですが、同じ答えがほぼ3年前にすでに与えられていました。
LS

3

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のようなステートメントを模倣しようとする場合は、最初のオプションを使用します。


2

これは、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.