TIL) Q객체

Jiwon Lee·2022년 7월 4일
0

TIL

목록 보기
11/19

Q()

Q객체는 쿼리문 자체를 객체로 다룰 수 있게 하는 클래스이다.
쿼리 조건문에 연산자를 사용한 조건을 걸어 데이터에 대한 필터링을 해주는 것이라고 보면 된다.
'|'는 '또는','or'의 합집합의 의미를 가지는 기호이며, '&'조건은 'and'로, 조건의 교집합을 찾는 기호이다.

Q객체를 사용하려면, 기본적으로 shell에서 먼저 테스트를 해보고 사용하는 것이 연습하기에 수월하다.

  • 먼저, Shell을 켜서 사용하고자 하는 모델과 Q를 import한다.
>>> from services.models import *
>>> from django.db.models import Q
>>> q = Q()

그 다음, 변수를 하나 지정해서 특정 class에 있는 데이터를 가져온다.

all()로도 모든 데이터를 가져올 수 있지만, filter()로 아무 조건 없이 빈 괄호를 넣으면 역시 모든 데이터를 가져올 수가 있다.

>>> service = Service.objects.filter()
>>> service
<QuerySet [<Service: Service object (1)>, <Service: Service object (2)>, <Service: Service object (3)>, <Service: Service object (4)>]
>>> services = Service.objects.filter(service_date = '2022-06-23')
>>> services
<QuerySet [<Service: Service object (2)>]>

services라는 변수에 특정 날짜를 필터링하여 지정해주었다.
이제 Q를 사용해보자.
우선 Shell에 'q'라고 치면 이렇게 나온다.

>>> q
<Q: (AND: )>

q에 대해서 어떠한 필터도 적용되어있지 않은 상태라면 이렇게 아무 값도 나오지 않는 것이 정상이다.

여기에서 Q에서 조건을 추가한다는 느낌으로 AND:가 붙는 것을 볼 수 있다.

>>> q = q&Q(service_date_get='2022-06-23')

라고 입력한다면 q값은 어떻게 나올까?
**아, 여기서 'get'는 'greater equal then'(>=)의 약어이다.

>>> q
<Q: (AND: (NOT (AND: ('status_id', 2))), ('service_date_gte', '2022-06-23'))>

이렇게 q값에 대한 정의를 마쳤다면, 적용을하여 더 자세한 결과값을 도출해 낼 수 있다.

>>> services = Service.objects.filter(q)
>>> services
<QuerySet [<AssignedService: AssignedService object (2)>, <AssignedService: AssignedService object (3)>, <AssignedService: AssignedService object (4)>

0개의 댓글