at_yasu's blog

ロード的なことを

クエリーセットのfilterメソッド

よく忘れてGoogle先生に尋ねる羽目になるのでメモ書き。

Djangoのデータベースラッパであるfilterを使う時、SQLで言う「where a like ...」や「where a > 0」とかを、filterではどう書くのか忘れます。例えば完全一致だと、SQLの場合は「where a == ...」ですがfilterの場合は「filter(a__exact=...)」ないしは「filter(a=...)」となります。


ちなみに、DBソフトによっては、大文字小文字区別が無かったりします。

挙動 SQL上での演算子 Django Filter
完全一致 = a*1 a = ...
完全一致 = exact a__exact=...
大文字小文字区別無しの一致 iLIKE '...' iexact a__iexact=...
大文字小文字区別有りの部分一致 like '%...%' contains a__contains=...
大文字小文字区別無しの部分一致 ilike '%...%' icontains a__icontains=...
大文字小文字区別有りの前方一致 like '...%' startswith a__startswith=...
大文字小文字区別無しの前方一致 ilike '...%' istartswith a__istartswith=...
大文字小文字区別有りの後方一致 like '%...' endswith a__endswith=...
大文字小文字区別無しの後方一致 ilike '%...' iendswith a__iendswith=...
...より大きい > gt a__gt=...
...以上 >= gte a__gte=...
...より小さい < lt a__lt=...
...以下 <= lte a__lte=...
リストに含まれている物を抽出 in (...) in a__in=...
日付や日時に対する範囲指定 between range a__range=(start_date, end_date)
年の厳密一致 between 'xxxx-01-01 00:00:00' and 'xxxx-12-31 23:59:59' year a_year=xxxx
月の厳密一致 (exact ('month' from ...) = ...) month a__month = ...
日の厳密一致 (exact ('day' from ...) = ...) day a__day = ...
NULL を取り出す is null isnull a__isnull=True
NULLでないのを取り出す is not null isnull a__isnull=False
全文検索 わがんね*2 search a__search=...

*1:つまり、無しの場合は完全一致になる

*2:MySQLだといけるらしい。Postgresqlでもあるよねぇ・・・?