Djangoで、OR検索

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

Python - Django
2018年11月26日16:04に更新(約17日前)
2018年11月26日16:04に作成(約17日前)

旧ブログ移行記事です。

概要

DjangoではANDでの検索は非常に簡単に行えます。filter()メソッドに、複数の条件を指定するだけです。

# タイトルにPythonが含まれていて、作成者がnarito
Post.objects.filter(title__icontains='Python', creator='narito')

ORの場合はどうでしょうか。条件が単純な場合...例えば、タイトルがPythonがDjangoの記事を取得したいならば、filter(title__in=['Python', 'Django'])のように簡単に書けます...(SQLでは、これはORというよりINによる検索ですね)

タイトルにPythonかDjangoが含まれているとか、タイトルもしくはカテゴリ名にPythonが含まれているといった少し複雑な条件になってくると、Qオブジェクトを使ったOR検索が役に立ちます。

使い方

タイトルにPythonかDjangoが含まれている場合の例です。

    post_list = Post.objects.filter(
        Q(title__icontains='Python') | Q(title__icontains='Django')
    )

Q(title__icontains='Python')の部分がそれぞれの条件になります。

タイトルもしくはカテゴリ名にPythonが含まれている場合ならば、以下のようになります。categoryはForeignKeyで紐づいているとします。

    post_list = Post.objects.filter(
        Q(title__icontains='Python') | Q(category__name__icontains='Python')
    )

category__nameとすることで、カテゴリのnameフィールドという指定になります。リレーション先フィールドの値を、簡単に条件に含めれます。

categoryがManyToManyFieldのケースは、場合によってはdistinct()による重複削除が必要になります。

Twitterでシェア FaceBookでシェア はてなブックマークでシェア

記事にコメントする