# 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" 인
값을 출력합니다.
본문 내용 중 오류가 있거나 실행이 잘 안되시는 분들은 밑에 댓글을 남겨주세요.
가능한 빠른 시일 내에 수정 및 답변 드리도록 하겠습니다.
'BackEnd > Django' 카테고리의 다른 글
Django 장고 - Secret key 파일 분리하는 방법 (0) | 2021.11.01 |
---|---|
Django 장고 Form_valid 함수 (0) | 2021.11.01 |
Django 외래키(Foreign Key)를 이용해 정보를 불러오는 방법 (6) | 2021.06.29 |
Django AbstractUser를 이용한 Custom User Field 확장 방법 (0) | 2021.06.28 |
Django 파일 업로드(File Upload) (0) | 2021.06.28 |