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


+ Random Posts