カテゴリ: Django 更新日: 2026/04/08

Django ORMで複数条件検索を完全解説!Qオブジェクトで初心者も安心

Django ORMで複数条件検索を行う方法(Qオブジェクト)
Django ORMで複数条件検索を行う方法(Qオブジェクト)

先生と生徒の会話形式で理解しよう

生徒

「Djangoでデータを探すとき、条件が一つだけじゃ足りないことが多いんですが、どうやって探せばいいんですか?」

先生

「複数の条件で検索したいときは、Django ORMのQオブジェクトを使うと、とても分かりやすく書けますよ。」

生徒

「Qオブジェクトって難しそうです…。パソコン初心者でも大丈夫ですか?」

先生

「大丈夫です。買い物の条件を考える感覚で理解できます。順番に見ていきましょう。」

1. Django ORMの複数条件検索とは

1. Django ORMの複数条件検索とは
1. Django ORMの複数条件検索とは

Django ORMの複数条件検索とは、データベースから情報を取り出すときに「年齢が20歳以上で、名前にAが含まれる」といったように、条件を組み合わせて探す方法です。Django ORMを使うことで、難しいSQLを書かなくても、Pythonの文法だけでデータ検索ができます。

特にWebアプリでは、検索フォームや絞り込み機能で複数条件検索がよく使われます。その中心的な役割を持つのがQオブジェクトです。

2. Qオブジェクトとは何か

2. Qオブジェクトとは何か
2. Qオブジェクトとは何か

Qオブジェクトは、検索条件を「部品」のように扱える仕組みです。料理で言えば、材料を自由に組み合わせるイメージです。AND条件やOR条件を、直感的に書けるのが特徴です。

Qオブジェクトを使わない場合、複雑な条件を書くのが大変になりますが、Qを使うことで読みやすく、修正もしやすくなります。

3. Qオブジェクトの基本的な使い方

3. Qオブジェクトの基本的な使い方
3. Qオブジェクトの基本的な使い方

まずは基本の書き方を見てみましょう。Qオブジェクトはdjango.db.modelsから読み込みます。


from django.db.models import Q

users = User.objects.filter(
    Q(age__gte=20) & Q(is_active=True)
)

これは「年齢が20歳以上」かつ「有効なユーザー」を探しています。&は「かつ」という意味です。

4. OR条件で検索する方法

4. OR条件で検索する方法
4. OR条件で検索する方法

次に「どちらか一方に当てはまればOK」というOR条件です。日常生活では「雨か雪なら傘を持つ」と考えるのと同じです。


users = User.objects.filter(
    Q(username__icontains="a") | Q(username__icontains="b")
)

|は「または」を意味します。名前にaかbが含まれるユーザーを探しています。

5. NOT条件で検索する方法

5. NOT条件で検索する方法
5. NOT条件で検索する方法

「〜ではない」という条件もQオブジェクトで書けます。これは否定条件と呼ばれます。


users = User.objects.filter(
    ~Q(is_staff=True)
)

~は否定を意味します。管理者ではないユーザーだけを取得しています。

6. 複数のQオブジェクトを組み合わせる

6. 複数のQオブジェクトを組み合わせる
6. 複数のQオブジェクトを組み合わせる

Qオブジェクトは自由に組み合わせることができます。条件が増えても、整理して書けるのが強みです。


users = User.objects.filter(
    (Q(age__gte=18) & Q(age__lte=30)) | Q(is_staff=True)
)

これは「18歳から30歳まで」または「管理者」のユーザーを探しています。

7. Qオブジェクトを使うメリット

7. Qオブジェクトを使うメリット
7. Qオブジェクトを使うメリット

Qオブジェクトを使う最大のメリットは、検索条件が増えてもコードが読みやすい点です。初心者の方でも、条件を日本語に置き換えて考えやすくなります。

また、後から条件を追加したり変更したりする場合も、Qオブジェクトなら安全に修正できます。

8. 初心者がつまずきやすいポイント

8. 初心者がつまずきやすいポイント
8. 初心者がつまずきやすいポイント

よくある間違いは、ANDとORの優先順位です。カッコを使わずに書くと、思った結果にならないことがあります。条件が多いときは、必ずカッコでグループ分けをしましょう。

Qオブジェクトは「条件を言葉で考えてから書く」ことが大切です。

まとめ

まとめ
まとめ

ここまで、Django ORMにおける複数条件検索とQオブジェクトの使い方について、基本から応用まで順番に学んできました。 Django ORMは、データベース操作をPythonのコードだけで直感的に書ける仕組みですが、条件が一つだけで済む場面は意外と少なく、 実際のWebアプリ開発では「複数条件検索」がほぼ必須になります。 その中核となるのがQオブジェクトです。

Qオブジェクトを使うことで、AND条件、OR条件、NOT条件といった複雑な検索条件を、 日本語で考えた内容に近い形でコードに落とし込めるようになります。 これは、プログラミング未経験の方や、Djangoを学び始めたばかりの初心者にとって、 非常に大きなメリットです。 条件を無理に一行で書こうとせず、「条件の部品」として組み立てられる点が、 Django ORMとQオブジェクトの大きな強みと言えるでしょう。

また、Qオブジェクトを使うことで、後から検索条件を追加したり、 仕様変更に対応したりする作業も楽になります。 実務の現場では、検索条件は頻繁に変わるため、 読みやすく修正しやすいコードを書くことがとても重要です。 Qオブジェクトを使った書き方に慣れておくことで、 保守性の高いDjangoアプリケーションを作れるようになります。

ここで、これまで学んだ内容を整理するために、 複数の条件を組み合わせた実践的なサンプルプログラムをもう一度確認しておきましょう。 実際の検索処理では、年齢、名前、権限、状態など、 さまざまな条件を同時に扱うケースが多くなります。

複数条件検索のサンプルプログラム


from django.db.models import Q

users = User.objects.filter(
    (Q(age__gte=20) & Q(is_active=True)) |
    Q(is_staff=True)
)

このコードでは、「年齢が20歳以上で有効なユーザー」または 「管理者ユーザー」を取得しています。 条件が増えても、Qオブジェクトを使えば、 どのような検索をしているのか一目で分かる形になります。

検索条件を整理する考え方

複数条件検索で大切なのは、いきなりコードを書くのではなく、 まず日本語で条件を整理することです。 「誰を探したいのか」「どんな条件を満たせば対象になるのか」を 文章で書き出してから、それをQオブジェクトに置き換えると、 ミスが減り、理解もしやすくなります。

特にANDとORが混ざる場合は、カッコを使って条件のまとまりを明確にすることが重要です。 これはDjango ORMに限らず、プログラミング全般で役立つ考え方です。 今回学んだQオブジェクトの使い方は、 Djangoで検索機能を作る上での基礎体力になるでしょう。

先生と生徒の振り返り会話

生徒

「最初はQオブジェクトって難しそうだと思っていましたが、 条件を日本語で考えてから書くと、意外と分かりやすいですね。」

先生

「その感覚がとても大切です。 Django ORMは、人が考える流れに近い形で書けるのが特徴ですからね。」

生徒

「ANDやORを組み合わせるときも、 カッコを意識すれば混乱しにくくなることが分かりました。」

先生

「その通りです。 複数条件検索は、実際のWebアプリでは必ず使います。 今回学んだQオブジェクトを使いこなせれば、 Djangoでできることが一気に広がりますよ。」

生徒

「これから検索機能を作るときは、 まずQオブジェクトを使うことを考えてみます。」

先生

「ぜひそうしてください。 今日の内容を何度か書いて試すことで、 Django ORMの理解がさらに深まるはずです。」

カテゴリの一覧へ
新着記事
New1
Django
Django ORMで複数条件検索を完全解説!Qオブジェクトで初心者も安心
New2
Flask
Flaskで多言語対応のログメッセージを出力する方法!Python初心者向けガイド
New3
Django
Django ORMで並び替え・ソートを完全解説!order_byの使い方を初心者向けにやさしく説明
New4
Django
Django ORMのfilter活用|初心者が最初に覚える検索クエリをやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでCassandraに接続する方法を完全ガイド!cassandra-driverの使い方
No.2
Java&Spring記事人気No2
Python
PythonでRedisをキャッシュとして活用!アプリを爆速にする方法を徹底解説
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Flask
PythonのFlaskで言語を自動判別!ユーザーに合わせた表示切り替えの仕組みを徹底解説
No.5
Java&Spring記事人気No5
Python
PythonでMySQLに接続する方法!pymysqlの基本的な使い方
No.6
Java&Spring記事人気No6
Flask
PythonのFlaskでテンプレートを多言語化!翻訳の基本構文を完全ガイド
No.7
Java&Spring記事人気No7
Python
PythonでCassandraのテーブル設計をマスター!初心者のためのデータモデル講座
No.8
Java&Spring記事人気No8
Python
PythonでCassandraをバックアップ!データの保存と復元を初心者向けに完全ガイド