Djangoで、OR検索
Python
Django
概要
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オブジェクトが必要になります。
Qオブジェクトの使い方
タイトルに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()
による重複削除が必要になります。