검색 조건이 복잡해지면 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 의 길이가 같음을 알 수 있다.