Django에서 ORM 다루기
Q객체 란?
장고 orm의 조작어 중 하나인 filter()에서 처리하는 형태는 기본적으로 & (AND) 형식이다. | (OR)와 같은 보다 복잡한 쿼리를 처리하기 위해서 Q 객체를 사용할 수 있다.
즉, 장고 orm에서 sql쿼리문처럼 or 조건을 쓰고 싶을때 사용할 수 있는 객체라고 할 수 있다.
Q객체 사용하기
1. import
Q객체는 Django 내장 모듈로 사용하려면 먼저 import를 해줘야 한다.
from django.db.models import Q
2. Q객체를 이용해 orm 조건절 정의
- AND 연산
## AND
# ex) first_name이 'a'로 시작하거나 last_name이 'b'로 시작하는 객체를 조회
User.objects.filter(Q(first_name__startswith='a') & Q(last_name__startswith='b'))
User.objects.filter(first_name__startswith='a', last_name__startswith='b')
👉 AND 연산 또한 q객체를 이용해 표현 할 수 있지만, filter()내에선 그냥 조건들을 , 로 연결하여 사용하는 것과 같다.
- OR 연산
## OR
# ex) first_name이 'a'로 시작하거나 last_name이 'b'로 시작하는 객체를 조회
User.objects.filter(Q(first_name__startswith='a') | Q(last_name__startswith='b'))
👉 OR연산은 구분되지 않으면 기본적으로 AND연산으로 인식하기 때문에 꼭 OR연산자 '|' 를 붙여줘야 한다.
- NOT 연산
## NOT
# ex) first_name이 'a'로 시작하는 것을 제외한 객체 조회
User.objects.filter(~Q(first_name__startswith='a'))
User.objects.exclude(first_name__startswith='a')
👉 exclude를 사용해 정의할 수 있지만 Q객체를 이용해 정의할 수 있다.
- 조건 연결하기
q = Q()
q.add(Q(age=30), q.OR)
q.add(Q(last_name='kim') | Q(last_name='lee'), q.AND)
q.add(~Q(first_name__startswith='a'), q.OR)
User.objects.filter(q)
위의 코드처럼 첫 번째 줄과 같이 빈 Q객체를 먼저 선언할 수 도 있다.
첫 번째 Q객체를 선언한 이후에 .add()메소드로 여러 개의 Q객체를 연결시킬 수 있다.
.add()에서 두 번째 인자에 앞의 Q객체와 연결될 때 어떤 연산자로 연결할지를 써주면 된다. (q.AND, q.OR 등)
위 예시를 아래 코드처럼 SQL문으로 작성하면 아래와 같다.
# 위와 동일한 결과
select *
from user
where age=30 and (first_name='kim' or first_name='lee') and last_name not like 'a%';
[참고 자료]
https://devvvyang.tistory.com/52
[Django] Q객체를 이용한 ORM 조건절
Django에서 QuerySet 조회 조건이 복잡할 때 Q객체를 사용하면 간결하게 코드를 작성할 수 있다. Q객체 사용하기 - import Q객체는 Django 내장 모듈로 사용하려면 먼저 import를 해야한다. from django.db.models
devvvyang.tistory.com
https://walkingplow.tistory.com/69?category=981358
장고 Q를 활용한 필터링, 정렬, 검색 방법
장고의 filter()에서 처리하는 키워드 아규먼트는 기본적으로 & (AND) 형식입니다. | (OR)와 같은 보다 복잡한 쿼리를 처리하려면 Q 객체를 사용할 수 있습니다. Q 객체(django.db.models.Q)는 키워드 아규먼
walkingplow.tistory.com
'woncoding > TIL' 카테고리의 다른 글
| TIL | 3.2.목 [Debugging] (0) | 2023.03.03 |
|---|---|
| TIL | 3.1.수 [Application Test (3)] (0) | 2023.03.02 |
| TIL | 2.28.화 [Application Test (2)] (0) | 2023.03.02 |
| TIL | 2.27.월 [Application Test (1)] (0) | 2023.03.02 |
| TIL | 2.24.금 [인덱스 | B-Tree/Hash Table] (0) | 2023.03.01 |