_won_
wonprogrammer
_won_
전체 방문자
오늘
어제
  • 분류 전체보기
    • woncoding
      • TIL
      • WIL
    • source Code
      • Python
      • Programmers
      • BAEKJOON

블로그 메뉴

  • 방명록

티스토리

Github · Wonprogrammer
hELLO · Designed By 정상우.
_won_

wonprogrammer

TIL | 3.3.금 [SQL / ORM (4) | Q객체]
woncoding/TIL

TIL | 3.3.금 [SQL / ORM (4) | Q객체]

2023. 3. 4. 12:42

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
    'woncoding/TIL' 카테고리의 다른 글
    • TIL | 3.2.목 [Debugging]
    • TIL | 3.1.수 [Application Test (3)]
    • TIL | 2.28.화 [Application Test (2)]
    • TIL | 2.27.월 [Application Test (1)]
    _won_
    _won_
    Coding Practice blog

    티스토리툴바