본문 바로가기

BackEnd/Django

Django 장고 ORM으로 OR/AND 사용하기(Q 사용)

반응형

# Django Queryset(ORM)으로 OR/AND 사용 방법 (WHERE절)
# Q 활용방법
# SQL의 OR/AND 사용하는 방법

# 전공자가 이해한 Django

 

 

1. AND

AND 사용 방법은 간단합니다. filter 함수 안에 "Field명=" 으로 표현하면 됩니다.
# view.py 파일이나 python shell 에서 사용

# shell 에서 사용하는 경우

from .models import catalog_info

catalog_info.objects.filter(
                            cat_id="cat0001",
                            cat_name="Javis",
                            cat_code="MARK07"
                            )

 

 

2. OR

기본 사용 방법은 아래와 같이 catalog_info 모델에서 cat_id가 "cat0001" 또는 "cat0002", "cat0003" 인 값들을 찾아서 출력하는 방법입니다.
# view.py 파일이나 python shell 에서 사용

# shell 에서 사용하는 경우

from django.db.models import Q
from .models import catalog_info

catalog_info.objects.filter(
                            Q(cat_id="cat0001")|
                            Q(cat_id="cat0002")|
                            Q(cat_id="cat0003")
                            )


다음으로는 Search 기능으로 사용하는 방법을 설명합니다. __icontains 와 .distinct() 를 사용합니다.
__icontains : 단어의 일부를 입력받아도 검색이 가능하도록 함
.distinct() : 중복된 행을 제거한 후 출력하도록 함
.distinct(X) : "X"열에 있는 값들을 기준으로 중복을 제거함("X"열이 중복되면 행 제거)

# 한 단어를 template로부터 입력받은 경우

searchWord = form.clean_data['search_word']

# __icontains : 단어가 일부를 표시해도 검색이 가능하도록 함
# .distinct : 중복된 row를 제거 후 출력

catalog_info.objects.filter(
                            Q(cat_id__icontains=searchWord)|
                            Q(cat_name__icontains=searchWord)|
                            Q(catalog_num__icontains=searchWord)|
                            Q(supplier__icontains=searchWord)
                            ).distinct()

 

 

3. Q() 를 이용해 여러 조건을 동시에 사용하는 방법

1번과 2번의 방법들은 AND, OR을 각각 단독 사용한 경우입니다.
이번 경우에는 AND 와 OR 을 연결해서 사용해보도록 하겠습니다.
아래의 조건은
1) cat_name = "Javis" 이고(AND)
2) vendor = "stark" 이거나(OR) vendor = "ironman" 이고(AND)
3) cat_name = "MARK07" 이고(AND)
4) price = 50000 이 아닌(NOT)
값을 출력합니다.
# view.py 파일이나 python shell 에서 사용

# shell 에서 사용하는 경우

from django.db.models import Q
from .models import catalog_info

q = Q()

q.add(Q(cat_name="Javis"), q.AND)
q.add(Q(vendor="stark")|Q(vendro="ironman"), q.AND)
q.add(Q(cat_num="MARK07"), q.AND)
q.add(~Q(price=50000), q.AND)

result = catalog_info.objects.filter(q)

위의 조건을 하나씩 설명하자면

1.
q = Q() 로 선언한다.
2. q.add 로 조건을 추가한다.
3. q.add(Q(Field명=찾는 값), q.AND) : 두번째 인자인 q.AND 는 앞의 값과 AND로 연결하는 역할을 한다.
4. q.add(Q(Field명=찾는 값), q.OR) : 두번째 인자인 q.OR은 앞의 값과 OR로 연결하는 역할을 한다.

입니다.

여기서 추가된 첫번째 값(q.add(Q(cat_name="Javis"), q.AND))의 경우 앞에 q=Q() 가 공백이기 때문에 두번째 인자(q.AND)는 의미를 갖지 않게 됩니다.
아래의 경우에서는 두번째 인자(q.AND)가 의미를 갖게 됩니다.

# 추가
q = Q(cat_category="anti")

q.add(Q(cat_name="Javis"), q.OR)
q.add(Q(cat_num="MARK07"), q.AND)

q = Q(cat_category="anti") 를 추가하면 두번째 줄(q.add(Q(cat_name="Javis"), q.OR)에서 q.OR이 의미를 갖게 됩니다. 그 의미는 아래의 1번과 같습니다.

1) cat_category = "anti" 이거나(OR)  *cat_category가 "anti"이면 아래 조건과 상관없이 출력
2) cat_name = "Javis" 이고(AND)
3) cat_name = "MARK07"

값을 출력합니다.

본문 내용 중 오류가 있거나 실행이 잘 안되시는 분들은 밑에 댓글을 남겨주세요.
가능한 빠른 시일 내에 수정 및 답변 드리도록 하겠습니다.
반응형