ORM

Django ORMでデータを除外して取得|exclude()の使い方

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条件で除外される