2013-05-03 4 views
22

私が(なしになることはできません)動的な値でクエリセットをフィルタリングする必要があります:私は単に書くことがあります。Django: 'field__isnull = True'または 'field = None'でクエリセットをフィルタリングしますか?

filtered_queryset = queryset.filter(field=value) 

または私はなしのためにチェックしなければならないが:

if value is None: 
    filtered_queryset = queryset.filter(field__isnull=True) 
else: 
    filtered_queryset = queryset.filter(field=value) 

挙動が依存するん特定のDBMS?

答えて

27

値のみをフェッチします。このUser.objects.filter(username=None)にヌルvalues..Basedを扱うことができます処理される第二の溶液を好みますORMはNone(NULLにキャスト)を処理し、QuerySetオブジェクトを返します。Noneの入力をキャッチする必要がない限り、最初の例は問題ありません。

>>> User.objects.filter(username=None) 
[] 
>>> type(_) 
<class 'django.db.models.query.QuerySet'> 
>>> print User.objects.filter(username=None).query 
SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" IS NULL 
+1

+1私はそれが「None」のように扱われていることは知らなかった。 – Ngenator

+3

私はDjango 1.7を使用していますが、両方とも同じクエリを生成します: [19]:str(User.objects.filter(username__isnull = True).query)== str(User.objects.filter(username = None ).query) Out [19]:True だから、どちらかを使うことができると思います。 – Akhorus

5

私はより良い

Update

if value is None: 
    filtered_queryset = queryset.filter(field__isnull=True) 
    //Do some proessing with filtered_queryset object with None values 
else: 
    filtered_queryset = queryset.filter(field=value) 
    //Do some proessing with filtered_queryset object with not NULL values 

クエリセットは、これは、ユーザ名= NULL

+0

問題は、私はそのように処理するためのいくつかの値を持っているということです... uはなし条件を処理し、その上にいくつかの処理を行いたい場合、あなたの第二の条件を示唆し – Don

+0

唯一の理由は、その後、uが使用している可能性がありました更新された答えをご覧ください。 – Rajeev

+0

ありがとうございます。最後の1つの質問:「これはusername = NULLのところでのみ値を取得する」と言うと、DjangoはDBバックエンドが必要とする場合に「username IS NULL」に変換するでしょうか? – Don

関連する問題