動的な値(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に依存しますか?
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
より適切に処理される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の値のみをフェッチします。