🐣

【Django】モデル検索で除外条件を指定する方法

2022/11/03に公開約1,300字

この記事では、Djangoがデフォルトで備えている「新しいQuerySetsを返すメソッド」のうち、「exclude()」について解説します。

公式ドキュメントを覗く 🫣

公式ドキュメントにはこのように書かれています。

exclude(*args, **kwargs)

与えられたルックアップ・パラメータにマッチしないオブジェクトを含む新しいQuerySetを返します。複数のパラメータは、SQL文の中でANDで結合され、全体はNOT()で囲まれます。

結論 ⚖️

exclude()を使うことで、除外条件を指定することができます。

使い方 💪

通常

次の例では、下記2条件の両方に該当するユーザーは除外されます。

  1. birthday(生年月日)が 2000年4月1日より新しい
  2. birth_place(出身地)が 東京都
objects = User.objects.exclude(
 birthday__gt=datetime.date(2000, 4, 1),
 birth_place='東京都'
)

上記をSQLで表すとー

SELECT ・・・
WHERE NOT (birthday > '2000-04-01' AND birth_place = '東京都')

次の例では、下記の2条件のどちらかに該当するものはすべて除外されます。

  1. birthday(生年月日)が 1990年4月1日より新しい
  2. birth_place(出身地)が 大阪府
objects = User.objects.exclude(
 birthday__gt=datetime.date(1990, 4, 1)
).exclude(
 birth_place='大阪府'
)

上記をSQLで表すとー

SELECT ・・・
WHERE NOT birthday > '1990-04-01'
AND NOT birth_place = '大阪府'

※2つ目の例は、1つ目と比較して、より限定的であるということに注意が必要です。


Qオブジェクトを用いる場合

exclude()では対応できず、より複雑なクエリ(OR句を含むクエリなど)を実行する必要がある場合は、Qオブジェクト(*args)を使用することで実現できます。
Qオブジェクトに「~演算子」を使うと否定の条件になります。

次の例では、下記2条件のいずれかに該当する場合はすべて除外して取得します。

  1. birth_place(出身地)が 沖縄
  2. birth_place(出身地)が 北海道
from django.db.models import Q

objects = User.objects.filter(
 ~Q(Q(birth_place='沖縄') | Q(birth_place='北海道'))
)

Discussion

ログインするとコメントできます