1. TOP
  2. ブログ
  3. Django SQL データベース 操作 まとめ 入門(2)where条件 filter(),exclude(),Qオブジェクト

Django SQL データベース 操作 まとめ 入門(2)where条件 filter(),exclude(),Qオブジェクト

更新日:2018年7月16日

Djangoで、モデルで定義したデータベースのテーブルからデータを取得したり操作したりする方法をDjangoの公式ドキュメントを参考にして、記載しています。where条件についてまとめています。

環境:Python3.6.5 Django2.0.8

WHERE 検索条件:filter()

models.py例
queryset = Entry.objects.filter(pub_date__year=2006)

上記は、カラム pub_date の年が2006のデータ取得です。

WHERE NOT 検索条件:exclude()

Entry.objects.filter(
    headline__startswith='What'
).exclude(
    pub_date__gte=datetime.date.today()
).filter(
    pub_date__gte=datetime.date(2005, 1, 30)
)

上記は、下記条件のデータ取得です。
headline like 'What%'
AND NOT pub_date >= '今日の日付'
AND pub_date >= '2005-1-3'

NOT 条件はexclude()を使用して、filter()とexclude()はチェーンによりAND条件として結合できます。

フィルターを適用した QuerySet はユニーク

q1 = Entry.objects.filter(headline__startswith="What")
q2 = q1.exclude(pub_date__gte=datetime.date.today())
q3 = q1.filter(pub_date__gte=datetime.date.today())

上記のように q3、q2を取得しても、元のq2、q1は追加条件の影響を受けずに元の条件のままで使用できます。

OR 条件の場合は Qオブジェクトを使用して検索

from django.db.models import Q
Q(question__startswith='Who') | Q(question__startswith='What')

上記は、次のSQLのWHERE句と同等です。

WHERE question LIKE 'Who%' OR question LIKE 'What%'

NOT は、~を使用

Q(question__startswith='Who') | ~Q(pub_date__year=2005)

Qオブジェクトを使用して filter(),exclude(),get()でデータを取得

Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)

上記は、次のSQLのWHERE句と同等です。

SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

B!

前の記事:Django SQL データベース 操作 まとめ 入門(1)全件、1件、件数

次の記事:Django SQL データベース 操作 まとめ 入門(3)order_by、values