23.5.1 TIL django Q

HS L·2023년 5월 1일
0

Q

django Q 객체란 쿼리문을 가져오는 제한조건들을 합쳐주는 기능을 한다.
예를 들어 Product라는 Model에서 filter함수를 사용하여 원하는 조건을 만족하는 객체들을 가져올 수 있다. filter사용 후 몇번이고 다시 적용할 수 있고 그 제한 조건들을 합쳐서 하나의 제한조건으로 합쳐주는게 Q객체이다.

예시

...
clothes = product.objects.filter(category='clothes')
clothes_type = cap_product.filter(type='top')
...

product중에서 카테고리가 clothes인 객체 쿼리셋을 불러온다.
불러온 쿼리셋에서 type이 top인 객체만 불러온다.

위와 같이 여러번 filter함수를 적용할 수도 있고 아래와 같이 여러 방법으로 제한조건들을 합쳐줄 수 있다.

...
from django.db.models import Q
# Q를 사용하기 위해 import해준다
...

...
product.objects.filter(Q(category='clothes') & Q(type='top))

이전 예시와 동일한 기능을 하기 위해서는 두개의 조건을 모두 만족해야 하기 때문에 and인 &을 사용해줬다. 상황에 따라 and = &, or = |연산자를 사용해준다.

Q객체를 선언해서 사용하는 방법도 있다.

q = Q()
q.add(Q(name='amy'), q.OR)
q.add(Q(name='sam'), q.AND)

q.add함수를 이용해서 조건들을 추가해주는 방식으로 첫번째 인자에서는 조건을, 두번째 인자에서는 앞의 조건과 연결되는 방식을 정해준다.

위 경우에서는 q가 비어있는 상태에서 첫번째 add가 실행되면
비어있는 조건과 OR로 연결되는 name='amy'가 실행될거고 앞의 조건이 비어있기때문에 OR은 의미를 갖지 않게 된다.

다음번째의 add가 실행될때는 q의 조건에 name='amy'가 있고
그것과 AND로 연결되는 name='sam'조건이 추가가 된다.

따라서 q의 제한조건은
name='amy' 이거나(AND) name='sam'인 조건을 만족하는 결과값을 가져올 수 있다.

profile
식이

0개의 댓글