장고에서 OR 연산을 가능하게 하는 Q() Objects를 알아보자. 당연히 이 포스팅도 공식 문서를 참고했다.
Complex lookups with Q objects
키워드 인수 쿼리(filter() 등)와 함께 사용한다. 더 복잡한 쿼리 예를 들면 OR 문이 있는 쿼리를 실행해야 하는 경우 Q 개체를 사용할 수 있다.
Q 객체(django.db.models.Q)는 키워드 인수 모음을 캡슐화하는 데 사용된다. 이러한 키워드 인수는 "필드 조회"에서와 같이 지정한다. 예를 들어, 아래와 같은 Q 객체는 단일 LIKE 쿼리를 캡슐화한다.
from django.db.models import Q
Q(question__startswith='What')
Q 갹채는 &, |, 및 ^ 연산자를 사용하여 결합할 수 있다. 연산자가 두 개의 Q 객체에 사용되면 새로운 Q 객체가 생성된다. 예를 들어, 이 구문은 두 개의 "question__startswith" 쿼리의 "OR"을 나타내는 단일 Q 객체를 생성한다.
Q(question__startswith='Who') | Q(question__startswith='What')
이 값은 다음 SQL WHERE 절과 동일하다.
WHERE question LIKE 'Who%' OR question LIKE 'What%'
Q 객체를 &, |, 및 ^ 연산자와 결합하여 임의의 복잡한 구문을 구성하고 괄호 그룹화를 사용할 수 있다. 또한 ~ 연산자를 사용하여 Q 객체를 부정할 수 있으므로 일반 쿼리와 부정된(NOT) 쿼리를 모두 결합하는 결합된 lookup이 가능하다.
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
키워드 인수(예: filter(), exclude(), get() 등)를 사용하는 각 lookup 함수는 하나 이상의 Q 객체를 위치 인수로 전달할 수 있다. 조회 함수에 여러 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')
조회 기능은 Q 객체와 키워드 인수의 사용을 혼합할 수 있다. 검색 함수에 제공되는 모든 인수(키워드 인수 또는 Q 객체)는 함께 "AND" 된다. 그러나 Q 객체가 제공되면 키워드 인수의 정의보다 선행돼야 한다. 예를 들어,
Poll.objects.get(
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
question__startswith='Who',
)
다음과 같은 경우는 유효하지 않다.
# INVALID QUERY
Poll.objects.get(
question__startswith='Who',
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
NOTE!
^ 는 XOR 이다.
참고
https://docs.djangoproject.com/en/4.1/topics/db/queries/#complex-lookups-with-q
'Django' 카테고리의 다른 글
Django 구조 잡기 (0) | 2023.02.18 |
---|---|
[DRF] SearchFilter (0) | 2023.02.16 |
[QuerySet] Built-in Expressions - F() 표현식 알아보기 (0) | 2023.01.17 |
[Queryset] select_related와 prefetch_related 살펴보기 (0) | 2023.01.13 |
[DRF] HyperlinkedModelSerializer 살펴보기 (0) | 2023.01.12 |