Django
のクエリセットの filter
メソッドを使うとき、毎回 Google
で使い方調べてたんですが、毎回調べるのも大変なので filter
メソッドの使い方をまとめました。
filter メソッドとは
SQL
でいうところの WHERE
句の部分の条件式のことになります。 Django
では SQL
文を直接記述することはなく、ラッパーである filter
メソッドなどを利用して SQL
文と同等の処理を記述していきます。
完全一致検索
Sample.objects.filter(field='条件')
もしくは、
Sample.objects.filter(field__exact='条件')
LIKE 句検索
LIKE
検索における大文字小文字の区別はデータベースの設定に依存するため、大文字小文字区別有りの filter
メソッドを利用しても、区別がされない場合があります。
完全一致(大文字小文字区別無し)
Sample.objects.filter(field__iexact='条件')
部分一致(大文字小文字区別有り)
Sample.objects.filter(field__contains='条件')
部分一致(大文字小文字区別無し)
Sample.objects.filter(field__icontains='条件')
前方一致(大文字小文字区別有り)
Sample.objects.filter(field__startswith='条件')
前方一致(大文字小文字区別無し)
Sample.objects.filter(field__istartswith='条件')
後方一致(大文字小文字区別有り)
Sample.objects.filter(field__endswith='条件')
後方一致(大文字小文字区別無し)
Sample.objects.filter(field__iendswith='条件')
大小比較
より大きい(greater than)
Sample.objects.filter(field__gt='条件')
以上(greater than equal)
Sample.objects.filter(field__gte='条件')
より小さい(less than)
Sample.objects.filter(field__lt='条件')
小さい(less than equal)
Sample.objects.filter(field__lte='条件')
IN 句検索
Sample.objects.filter(field__in=['条件1', '条件2'])
BETWEEN句検索
Sample.objects.filter(field__range=(start, end))
日付の厳密一致
年
Sample.objects.filter(field__year='2022')
月
Sample.objects.filter(field__month='01')
日
Sample.objects.filter(field__day='01')
IS NULL
Sample.objects.filter(field__isnull=True)
IS NOT NULL
Sample.objects.filter(field__isnull=False)
全文検索
Sample.objects.filter(field__search='条件')
最後に
filter
メソッド自体はよく使うんですが、細かい条件指定までは覚えてないことが多かったので整理してみました。 MVC
モデルなどで O/R
マッパーを使って開発していると、どうしても素の SQL
を意識せずに開発を進めがちですが、きちんと SQL
の組み立ても意識しながら filter
メソッドなどのラッパーを有効活用していきたいと思います。
コメント
こんにちは。
私もDjangoの開発時にfilter条件をよくググるのでまとめて頂き感謝しています。
1点、BETWEEN句の記述に漏れがあるようでしたのでご報告です。
誤:Sample.objects.filter(field__range(start, end))
正:Sample.objects.filter(field__range=(start, end))
タイポだと思いますが念のため。
宜しくお願いします。
ご指摘ありがとうございます。
BETWEEN句の記述の部分修正しました。
[…] DjangoのQuerySetのfilterメソッドの使い方まとめ […]
[…] [Django]QuerySetのfilterメソッドの使い方まとめ […]
[…] [Django]QuerySetのfilterメソッドの使い方まとめ 読了http://43.206.46.12/django-queryset-filter/ […]