36

一連のフィルターを使用して、データベースから一連の行を取得したいと思います。

条件付きフィルターがdjangoに適用できるかどうか疑問に思いました。つまり、「変数がNoneでない場合はフィルタリングするか、それ以外の場合はフィルタリングを適用しない」ということです。

このようなもの:

user = User.objects.get(pk=1)
category = Category.objects.get(pk=1)
todays_items = Item.objects.filter(user=user, date=now()).conditional_filter(category=category))

カテゴリがNoneでない場合にのみ、カテゴリフィルタを適用します。

カテゴリがNoneの場合(リクエストオブジェクトで指定されていないことを意味します)、このフィルターはまったく適用されません。これは私にたくさんの「if-elif-else」状況を救うでしょう。

これを行う方法はありますか?

4

5 に答える 5

50

クエリを連鎖させることができます:

user = User.objects.get(pk=1)
category = Category.objects.get(pk=1)
qs = Item.objects.filter(user=user, date=now())
if category:
    qs = qs.filter(category=category)

クエリセットは遅延実行されるため、アイテムを表示するときのみ DB ヒットが発生します。

于 2012-09-29T09:29:46.600 に答える
16

それらはあなたの問題へのいくつかのアプローチです。1つのアプローチは、Qオブジェクトを使用した複雑なルックアップで遊ぶことです

from django.db.models import Q

user = User.objects.get(pk=1)
category = Category.objects.get(pk=1)

f1 = Q( user=user, date=now() )
f_cat_is_none = Q( category__isnull = True )
f_cat_is_not_none = Q( category=category )

todays_items = Item.objects.filter( f1 & ( f_cat_is_none | f_cat_is_not_none ) )

これがあなたが探しているクエリであるかどうかは、あなたの答えではよくわかりませんが、この例では、独自のクエリを簡単に作成できます。

編集されたOPコメント

category__isnull == Trueは、データベース内でアイテムに関連付けられたカテゴリがないことを意味します。おそらく、探しているクエリは次のとおりです。

from django.db.models import Q

user_pk = 1
category_pk = 1  #some times None

f = Q( user__pk = user_pk, date=now() )
if category_pk is not None:
  f &= Q( category__pk = category_pk )

todays_items = Item.objects.filter( f  )

これは単なるコード サンプルであり、要件に合わせてください。single_と double には注意してください__

于 2012-09-29T08:42:00.830 に答える
1
from django.db.models import Q

qs = Users.objects.filter(
                    p_id=parent_id,
                    status=True
                ).all()

if user_id>0:
    qs = qs.filter( ~Q(id=user_id) )

qsフィルタリングされた結果を取得します

于 2019-11-01T13:04:05.283 に答える