ジャンゴのこのSQL文に相当するものは何ですか?
SELECT * FROM table_name WHERE string LIKE pattern;
djangoでこれを実装するにはどうすればよいですか?私は試した
result = table.objects.filter( pattern in string )
しかし、それはうまくいきませんでした。これを実装するにはどうすればよいですか?
ジャンゴのこのSQL文に相当するものは何ですか?
SELECT * FROM table_name WHERE string LIKE pattern;
djangoでこれを実装するにはどうすればよいですか?私は試した
result = table.objects.filter( pattern in string )
しかし、それはうまくいきませんでした。これを実装するにはどうすればよいですか?
回答:
__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
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のようなステートメントを模倣しようとする場合は、最初のオプションを使用します。
これは、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')