DjangoのORMで特定の条件に合うデータを除外して取得するには、exclude()メソッドを使用します。filter()の逆の動作で、指定した条件に一致しないレコードを返します。
基本的な使い方
views.py
model = Company.objects.all().exclude(pk=1);
説明
Step 1excludeメソッドの基本
Djangoでは、以下の形式で取得したモデルから特定の条件に一致するデータを除外することができます:
モデル.objects.all().exclude(除外する条件) モデル.objects.filter(条件).exclude(除外する条件)
例えば、すべてのCompanyモデルからpkが1のデータを除外する場合:
companies = Company.objects.all().exclude(pk=1)
上の例ではCompanyモデルをpkが1のもの以外を取得しています。
Step 2様々な条件での除外
excludeメソッドでは、filterと同様に様々な条件を指定できます:
# 名前が「test」のデータを除外 companies = Company.objects.all().exclude(name="test") # idが5未満のデータを除外 companies = Company.objects.all().exclude(id__lt=5) # 名前に「株式会社」を含むデータを除外 companies = Company.objects.all().exclude(name__contains="株式会社")
Step 3複数条件での除外
複数の条件を指定して除外することもできます:
# 名前が「test」でidが10のデータを除外 companies = Company.objects.all().exclude(name="test", id=10) # 複数のidを持つデータを除外 companies = Company.objects.all().exclude(id__in=[1, 3, 5])
カンマで区切られた複数の条件は「AND」条件として扱われ、すべての条件に一致するデータのみが除外されます。
Step 4filterとexcludeの組み合わせ
filterとexcludeを組み合わせて、より細かい条件でデータを取得できます:
# nameに「test」を含むデータのうち、idが10のデータを除外 companies = Company.objects.filter(name__contains="test").exclude(id=10) # 複数のfilterとexcludeを組み合わせる companies = Company.objects.filter(name__contains="会社").exclude(id__lt=5).filter(id__lt=20)
このように、filterとexcludeをチェーンして複雑な条件を表現できます。
Step 5実践的な使用例
views.pyでのexcludeメソッドの使用例:
from django.shortcuts import render
from .models import Company
def active_companies(request):
# 非アクティブな会社を除外して取得
companies = Company.objects.all().exclude(is_active=False)
# テンプレートに渡す
return render(request, 'companies/active_list.html', {
'companies': companies,
'title': 'アクティブな会社一覧'
})
def filtered_companies(request):
# 検索クエリを取得
query = request.GET.get('q', '')
exclude_id = request.GET.get('exclude_id', None)
# 基本クエリ
companies = Company.objects.filter(name__contains=query)
# 特定のIDを除外(指定された場合)
if exclude_id:
companies = companies.exclude(id=exclude_id)
return render(request, 'companies/company_list.html', {
'companies': companies,
'query': query,
'exclude_id': exclude_id
})
ポイント
注意点: excludeメソッドは「~ではない」という条件を表現できるため、filterだけでは実現しにくい複雑なクエリを簡潔に書くことができます。ただし、複数のexcludeを組み合わせると、意図しない結果になることがあるため注意が必要です。
まとめ
exclude()メソッドで条件に合うデータを除外して取得できるfilter()の逆で、条件に一致しないレコードが返されるfilter()と同様にルックアップ(__contains,__gteなど)が使えるfilter()とexclude()はチェーンで組み合わせ可能- 複数の条件を指定するとAND条件で除外される