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=【リスト】)
BETWEEN句検索
Sample.objects.filter(field__range=(start, end))
日付の厳密一致
年
Sample.objects.filter(field__year=年)
月
Sample.objects.filter(field__month=月)
日
Sample.objects.filter(field__day=日)
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メソッドの使い方まとめ 読了https://codelab.website/django-queryset-filter/ […]