-
[Django] Where 절 or 문 사용하기 (Q() 사용하기)언어/파이썬 & 장고 2019. 1. 22. 20:27
Django model ORM로 Where절에 or 문을 추가하고 싶다면 Q() 를 사용해야 합니다. 사용법은 아래와 같습니다.
사용하기
OR
from django.db.models import Q Base.objects.filter( Q(name='qwer') | Q(no=152124)
# 동일한 결과 # SELECT * FROM base WHERE no=152124 OR name='qwer'
Q() 조건 연결
from django.db.models import Q q = Q() q.add(Q(no=12121), q.OR) q.add(Q(name=lee)|Q(name=kim), q.AND) q.add(Q(142411), q.OR) Base.objects.filter(q)
# 동일한 결과 # SELECT * FROM base WHERE (no=12121 AND (name='lee' OR name='kim')) OR no=142411
NOT 구문 표현하기
from django.db.models import Q q = Q() q.add(Q(no=12121), q.OR) q.add(Q(name=lee) & ~Q(name=kim), q.AND) Base.objects.filter(q)
# 동일한 결과 # SELECT & FROM base WHERE no=12121 AND name='lee' AND NOT (name='kim')
주의사항
Q()를 사용할 때 조심할 점은 첫 Q() 선언 이후 .add()로 추가할 때, 2번째 인자값은 어떤 쿼리로 연결할지를 나타내는데 여기에 선언된 값으로 앞의 조건과 연결이 됩니다.
q = Q(no=1) q.add(name='lee', q.OR)
# no=1 or name='lee'
Q를 선언한 이후, 해당 인스턴스에서 .OR이나 .AND, .connector를 볼 수 있습니다. 여기서 OR나 AND는 조건문과 동일한 연결문입니다. .connector는 바로 이전에 사용한 연결문을 뜻합니다. 아무것도 선언되지 않았을 때, 기본 값은 AND 입니다.
OR 나 AND는 클래스 변수로 선언되어 있기 때문에 q = Q(); q.AND 나 Q.AND나 동일합니다.
q = Q(item_no=123123123) print(q.connector) q.add(Q(gs_item_no=0), q.OR) print(q.connector)
# AND # OR