【Django】filterメソッドを使って特定期間のクエリセットを取得する


投稿日 2025年11月11日 >> 更新日 2025年11月11日

概要

Djangoのクエリオブジェクトであるquery.objects.filterを使って、datetime型のフィールドを持つモデルのデータベースから特定期間(例:2025-11-11~2026-1-11)のデータを持つクエリセットを取得します。

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux 2
Python 3.6.15
使用ライブラリ
Django==3.2.25

filterメソッドの引数にルックアップタイプを付与してデータを絞り込む

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 <= now:start_dateより現在の日付時間が下回っていればTrue
  • end_date >= now:end_dateが現在の日付時間より上回っていればTrue
  • AND:複数の引数を組み合わせることによって両方を満たす結果となる

上記を満たすデータを取得してくることができます。

start_date、end_dateのどちらかのフィールド値がFalseであれば取得されません。

以上となります。

最後までご覧いただきありがとうございました。