django queryset에서 OR 조건을 실행하는 방법
다음 SQL 쿼리에 해당하는 Django 쿼리를 작성합니다.
SELECT * from user where income >= 5000 or income is NULL.
장고 쿼리셋 필터는 어떻게 구성합니까?
User.objects.filter(income__gte=5000, income=0)
이거 안 돼, 왜냐하면AND
는 필터입니다.하고싶어OR
개별 쿼리 세트의 합성을 가져오는 필터입니다.
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))
QuerySet은 Python을 구현하기 때문에__or__
오퍼레이터(|
or union은 기능합니다.예상대로|
이진 연산자가 a를 반환합니다.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 참조에 완전히 문서화되어 있습니다.자세한 내용은 Django Project 티켓 번호 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 Cookbook에서는 이에 대해 자세히 설명하고 있습니다.관련 부분은 다음과 같습니다.
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-sublic book
에 접속하는 복수의 필터에 대해서, 이것을 추가하는 것 뿐입니다.Q
만약 누군가 그걸 보고 있다면요.만약 a가Q
오브젝트가 제공되므로 키워드 인수의 정의보다 선행해야 합니다.그렇지 않으면 비활성 쿼리입니다.당신은 그것을 할 때 조심해야 해요.
예를 들면
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True),category='income')
여기서는 OR 조건과 소득 범주를 포함하는 필터를 고려한다.
SQL 쿼리에서 사용하는 "OR" 또는 "AND"와 같은 조건을 추가하기 위해 이 방법을 예로 들 수 있습니다.
from django.db.models import Q
Poll.objects.get(Q(question__startswith='Who'),Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
이것은 이 SQL 쿼리와 동일합니다.
SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
"는 "AND" 연산자를 위한 것이고 "|"는 django에서 사용되는 "OR" 연산자를 위한 것이라는 것을 이해해주길 바랍니다.
언급URL : https://stackoverflow.com/questions/6567831/how-to-perform-or-condition-in-django-queryset
'programing' 카테고리의 다른 글
jQuery를 사용하여 드롭다운 목록(선택 상자)에서 선택한 텍스트를 가져옵니다. (0) | 2022.10.26 |
---|---|
PHP를 사용하여 임의 16진수 색상 코드 생성 (0) | 2022.10.26 |
Python과 줄바꿈을 사용하여 파일에 목록 작성 (0) | 2022.10.26 |
의존성 주입 생성자의 광기를 방지하는 방법 (0) | 2022.10.26 |
java String.split()의 효과를 되돌리는 메서드? (0) | 2022.10.25 |