回答:
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))
QuerySetはPython __or__
演算子(|
)、または共用体を実装しているため、機能します。ご想像のとおり、|
2項演算子はQuerySet
so order_by()
、を返し、.distinct()
他のクエリセットフィルターは最後まで追加できます。
combined_queryset = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)
ordered_queryset = combined_queryset.order_by('-income')
アップデート2019-06-20:これはDjango 2.1 QuerySet APIリファレンスに完全に記載されています。より歴史的な議論はDjangoProjectチケット#21333にあります。
どちらのオプションも、既存の回答ですでに言及されています。
from django.db.models import Q
q1 = User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))
そして
q2 = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)
ただし、どちらを優先するかについては、いくつかの混乱があるようです。
ポイントは、それらはSQLレベルで同一であるため、好きなものを自由に選択してください!
DjangoのORMクックブックは、ここで、このことについていくつかの詳細に語っ関連する部分です。
queryset = User.objects.filter(
first_name__startswith='R'
) | User.objects.filter(
last_name__startswith='D'
)
につながる
In [5]: str(queryset.query)
Out[5]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
"auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
"auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
"auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R% OR "auth_user"."last_name"::text LIKE D%)'
そして
qs = User.objects.filter(Q(first_name__startswith='R') | Q(last_name__startswith='D'))
につながる
In [9]: str(qs.query)
Out[9]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
"auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
"auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
"auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R% OR "auth_user"."last_name"::text LIKE D%)'