【Django】filterメソッドを使って特定期間のクエリセットを取得する
概要
Djangoのクエリオブジェクトであるquery.objects.filterを使って、datetime型のフィールドを持つモデルのデータベースから特定期間(例:2025-11-11~2026-1-11)のデータを持つクエリセットを取得します。
| 実行環境 |
|---|
| Windows Subsystem for Linux 2 |
| Python 3.6.15 |
| 使用ライブラリ |
|---|
| Django==3.2.25 |
Djangoのクエリオブジェクトであるfilter()、 exclude() 、 get()の各メソッドにはルックアップタイプを付与することができる。
ルックアップタイプとはデータベースクエリで言うWHERE句と同じ結果をもたらす条件式です。
データベースの条件式では、比較演算子や論理演算子を使って定義しますが、Djangoのルックアップタイプでは「引数名__exact」のように付与することによって条件を絞り込めます。
| 演算子 | 意味 | ルックアップタイプ |
|---|---|---|
| = | 等しい | __exact |
| >= | 以上 | __gte |
| <= | 以下 | __lte |
詳しくは公式ドキュメントへ
以下のようなstart_dateとend_dateのフィールドを持つモデルがあったとします。
models.py
class Test(models.Model):
subject = models.CharField(max_length=50)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
上記のようにstart_dateとend_dateに従った期間のクエリセットを取得したい場合は、以下のように定義することによって取得することができます。
from django.utils import timezone
from myapp.models import Test
now = timezone.now()
queryset = Test.objects.filter(start_date__lte=now, end_data__gte=now)
比較演算子で見ると
上記を満たすデータを取得してくることができます。
start_date、end_dateのどちらかのフィールド値がFalseであれば取得されません。
以上となります。
最後までご覧いただきありがとうございました。