programing

django queryset에서 OR 조건을 실행하는 방법

shortcode 2022. 10. 26. 22:45
반응형

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

반응형