[TIL] Django: 복잡한 필터링을 위한 Q 객체

Jene Hojin Choi·2021년 3월 7일
0

Django

목록 보기
11/12
post-thumbnail

Q object

검색 조건이 복잡해지면 filter()안에 들어갈 것들이 무한정으로 길어질 것이다. 그렇다면 filter(.............) 이렇게 줄줄이 길어지게 코드를 짤 것인가?
이렇게 더 복잡한 필터링 조건을 걸어야할때는 빈 Q객체가 필요하다.

>>> from django.db.models  import Q
>>> q = Q()
>>> q.add(Q(max_capacity__gt=2), Q.OR) 		      [1]
>>> q.add((Q(price__lt=110000) & Q(price__gt=20000)), Q.AND)  [2]

>>> >>> accommodations = Accommodation.objects.filter(q)
>>> len(accommodations)
23
>>> accommodations2 = Accommodation.objects.filter(max_capacity__gt=2,
price__lt=110000, price__gt=20000)
>>> len(accommodations2)
23

[1] 빈 Q 객체인 q에 Q(max_capacity__gt=2)를 이어주려면 Q.OR이어야한다.
앞의 조건이 빈 것이라 and를 써주면 q = (Q() & Q(max_capacity__gt=2)) 이 되어 q조건이 빈 조건이 되기 때문이다.

[2][1]에서 OR를 써주어 q = (Q() | Q(max_capacity__gt=2))이 된 Q 객체에 AND를 써서 price__lt=110000, price__gt=20000를 추가적으로 해준다.
그러면
q = ((Q() | Q(max_capacity__gt=2)) & Q(price__lt=110000 & price__gt=20000)) 가 된다.

같은 조건을 filter()안에 풀어서 써서 accommodations2를 뽑아낼 수 있었다.
위에서 accommodations와 accommodations2 의 길이가 같음을 알 수 있다.

0개의 댓글