[Django] ORM으로 Where절에 or문 사용하기 Q()

hukim·2020년 11월 8일
3

Django

목록 보기
7/12
post-custom-banner

Django 에서 model ORM으로 Where절에 or 문을 추가하고 싶다면 Q() 를 사용해야 합니다.

OR 사용하기

  • company 테이블에서 sub_category의 id가 '1'인 회사들
  • company 1 ~ 8

  • company 테이블에서 sub_category의 id가 '2'인 회사들
  • company 9 ~ 16

위의 두 조건들을 한꺼번에 쓰고 싶다면 OR 조건을 이용해서 둘 다 한꺼번에 가져옵니다.

from django.db.models import Q

Company.objects.filter(
	Q(explore_sub_category=1) | Q(explore_sub_category=2)
)

Q()를 이용해서 조건들을 입력한다음 | 기호로 filter에서 한꺼번에 처리 해줬습니다.

SQL Logger에서도 WHERE 절에 OR 가 적용되있는 것을 확인했습니다.

조건 연결하기

그렇다면 AND 조건을 쓸때는 어떻게 하고,
AND와 OR 조건을 같이 쓰고 싶을 때는 어떤 방법이 좋을까요?

  • sub_category의 id가 1 이면서 city의 id가 2인 회사들

기존에 사용하던 것 처럼 filter에 조건을 여러가지 입력하게 되면
SQL Logger에서도 나타나듯이 WHERE절 다음에 AND로 실행됩니다.

그런데 예를 들어 사용자가 filter의 조건들을 선택할 수도 있고 안할수도있는 동적인 상황이라면
filter의 조건들도 고정된 조건들이 아닌 동적으로 필요할 때 추가해서 들어가야 할텐데
이러한 경우에는 Q()에 조건들을 연결해서 사용합니다.

from django.db.models import Q

q = Q()
q.add(Q(explore_sub_category=1, q.OR)
q.add(Q(district__city=2, q.AND)
q.add(Q(response_rate=1, q.OR)

Company.objects.filter(q)

### MySQL
SELECT * FROM companies WHERE (explore_sub_category=1 AND district__city=2 OR response_rate=1)

filter에 들어갈 조건들을 q.add로 추가할 수 있기 때문에 if 조건문을 활용하면
조건들을 상황에 맞게 추가할 수 있습니다.

NOT 사용하기

from django.db.models import Q

q = Q()
q.add(Q(explore_sub_category=1, q.OR)
q.add(~Q(district__city=2, q.AND)
q.add(Q(response_rate=1, q.OR)

Company.objects.filter(q)

### MySQL
SELECT * FROM companies WHERE (explore_sub_category=1 AND NOT district__city=2 OR response_rate=1)

주의할점

q = Q(explore_sub_category=1)
q.add(district__city=2, q.OR)

### 
explore_sub_category = 1 OR district__city = 2

첫 Q() 선언 이후 add()로 추가할 때, 2번째 인자값은 어떤 쿼리로 연결할지를 나타내는데
여기에 선언된 값으로 앞의 조건과 연결이 된다는 점입니다.

post-custom-banner

1개의 댓글

comment-user-thumbnail
2020년 12월 14일

도움 받고 갑니다!!^^

답글 달기