답변:
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))
때문에 검색어 세트 구현 파이썬 __or__
연산자 ( |
), 또는 노동 조합을, 그냥 작동합니다. 당신이 기대하는 것처럼, |
바이너리 연산자는를 반환 QuerySet
그래서 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 수준 에서 동일 하므로 원하는 것을 자유롭게 선택하십시오!
장고 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%)'
출처 : django-orm-cookbook