web-dev-qa-db-ja.com

Django:「field__isnull = True」または「field = None」でクエリセットをフィルタリングしますか?

動的な値(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に依存しますか?

23
Dona

ORMはNone(NULLにキャスト)を処理し、QuerySetオブジェクトを返します。したがって、None入力をキャッチする必要がない限り、最初の例は問題ありません。

>>> User.objects.filter(username=None)
[]
>>> type(_)
<class 'Django.db.models.query.QuerySet'>
>>> str(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
30

より適切に処理される2番目のソリューションを好む

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値を処理できます。このUser.objects.filter(username=None)に基づいて、これはusername = NULLの値のみをフェッチします。

6
Rajeev