ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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


    댓글