(最終更新月:2021年12月)
「filterメソッドを使いこなしたい!」
「部分一致でfilterする方法が知りたい!」
というDjangoユーザーへ向けての記事となります
当記事を通じて、
- filterメソッドを使いこなすための「フィールドルックアップ」
についてを徹底解説していきます!
当記事を読み進めれば、「フィールドルックアップとは何か」「フィールドルックアップの使い方」がマスターできるように構成しています
フィールドルックアップとは?
filterメソッドの基本的な使い方として、
<QuerySet>.objects.filter(フィールド名=”値”)
と「=」を使うことが多いかと思います
もちろん有効な使い方ではありますが、filterメソッドでは「=」(完全一致)だけでなく、部分一致や大なり小なり、など一定の条件によるQuerySetの取得が可能です
その場合の書き方は、
<QuerySet>.objects.filter(フィールド名__ルックアップ=”値”)
となり、フィールド名とルックアップをアンダースコア(「 _ 」)2つで連結します
具体的にどんなルックアップがあるのかをみていきましょう!
代表的なルックアップ(Field Lookups)
ルックアップは、filterメソッド内で、
…filter(フィールド名__ルックアップ=”値”)
として使用します
どのような条件でQuerySetを取り出すか、により適切なものを選ぶ必要があります
代表的なものをご紹介します
icontains
部分一致
qs = NippoModel.objects.filter(tittle__icontains="test")
「qs」には、タイトルに「test」という文字を含む日報が格納されます
istartswith/iendswith
istartswith: 始まりが一致する
iendswith: 終わりが一致する
qs = NippoModel.objects.filter(content__istartswith="はじめまして")
「qs」には、内容(コンテンツ)が「はじめまして」という文字で始まる日報が格納されます
qs = User.objects.filter(email__iendswith="@itc.tokyo")
「qs」には、「@itc.tokyo」で終わるEメールアドレスを持つユーザーが格納されます
「icontains」でなく、「contains」
「istartswith」でなく、「startswith」
「iendswith」でなく、「endswith」
も存在します
頭の「i」外すと、英字での大文字小文字を区別するようになります
目的に合わせて使い分けましょう
in
リストに値が含まれているかどうか
qs = NippoModel.objects.filter(id__in=[1, 3, 5])
プライマリーキー(id)が1,3,5の日報を取り出します
gt / gte / lt / lte
gt: “値”より大きい greater than
gte: “値”より大きい、もしくは等しい greater than or equal to
lt: “値”より小さい less than
lte: “値”より小さい、もしくは等しい less than or equal to
qs = NippoModel.objects.filter(id__gt=3)
プライマリーキー(id)が3より大きい日報を取り出します
英語で考えると覚えやすいです!
greater than は gt 等
まとめ
フィールドルックアップを使ったfilterメソッドの書き方は、
<QuerySet>.objects.filter(フィールド名__ルックアップ=”値”)
となります
「__」は、アンダースコア「_」が2つなので気をつけて!
QuerySetをどのように取得したいかで正しいフィールドルックアップを選ぶようにしましょう!
「どんなフィールドルックアップがあったっけ?」という方はいつでも当記事まで戻ってきてください!