r잡초처럼
바른 프로그래밍
r잡초처럼
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • FastAPI (7)
    • 끄적끄적 (2)
    • Python (17)
    • Django (31)
    • Database (2)
    • Docker (7)
    • 디자인패턴 (2)
    • CS 공부 (12)
      • 알고리즘 (2)
      • 자료 구조 (1)
      • 네트워크 (7)
      • IT 지식 (1)
      • 운영체제 (1)
    • 기타 팁들 (10)
    • Aws (2)
    • 독서 (1)
    • 코딩테스트 공부 (1)
      • 백준 (0)
      • 프로그래머스 (1)
    • DevOps (13)
    • TIL (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 5장 회사에서 하는 랜 구성
  • 모두의 네트워크
  • pycharm
  • 상속과 컴포지션
  • encoding
  • dotenv
  • CS 지식
  • 상속 안티 패턴
  • 파이썬 클린 코드
  • cp949
  • 케이블의 종류
  • fastapi
  • 전기 신호
  • 랜과 왠
  • 책 리뷰
  • 물리 계층
  • 네트워크
  • 6장
  • 완벽한 IT 인프라 구축을 위한 Docker
  • docker
  • validate
  • 7장
  • depends
  • query param
  • preonboarding
  • 컴퓨터 기본 지식
  • poetry
  • 랜 카드
  • pytest
  • Batch

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
r잡초처럼

바른 프로그래밍

Django

[QuerySet] Q() Objects 알아보기

2023. 1. 18. 20:25

장고에서 OR 연산을 가능하게 하는 Q() Objects를 알아보자. 당연히 이 포스팅도 공식 문서를 참고했다.

Complex lookups with Q objects

키워드 인수 쿼리(filter() 등)와 함께 사용한다. 더 복잡한 쿼리 예를 들면 OR 문이 있는 쿼리를 실행해야 하는 경우 Q 개체를 사용할 수 있다.  

 

Q 객체(django.db.models.Q)는 키워드 인수 모음을 캡슐화하는 데 사용된다. 이러한 키워드 인수는 "필드 조회"에서와 같이 지정한다. 예를 들어, 아래와 같은 Q 객체는 단일 LIKE 쿼리를 캡슐화한다.

from django.db.models import Q
Q(question__startswith='What')

 Q 갹채는 &, |, 및 ^ 연산자를 사용하여 결합할 수 있다. 연산자가 두 개의 Q 객체에 사용되면 새로운 Q 객체가 생성된다. 예를 들어, 이 구문은 두 개의 "question__startswith" 쿼리의 "OR"을 나타내는 단일 Q 객체를 생성한다.

Q(question__startswith='Who') | Q(question__startswith='What')

이 값은 다음 SQL WHERE 절과 동일하다.

WHERE question LIKE 'Who%' OR question LIKE 'What%'

Q 객체를 &, |, 및 ^ 연산자와 결합하여 임의의 복잡한 구문을 구성하고 괄호 그룹화를 사용할 수 있다. 또한 ~ 연산자를 사용하여 Q 객체를 부정할 수 있으므로 일반 쿼리와 부정된(NOT) 쿼리를 모두 결합하는 결합된 lookup이 가능하다.

Q(question__startswith='Who') | ~Q(pub_date__year=2005)

키워드 인수(예: filter(), exclude(), get() 등)를 사용하는 각 lookup 함수는 하나 이상의 Q 객체를 위치 인수로 전달할 수 있다. 조회 함수에 여러 Q 객체 인수를 제공하면 인수가 함께 한다. 예를 들면,

Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)

이것은 다음의 SQL과 같다.

SELECT * from polls WHERE question LIKE 'Who%'
    AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

조회 기능은 Q 객체와 키워드 인수의 사용을 혼합할 수 있다. 검색 함수에 제공되는 모든 인수(키워드 인수 또는 Q 객체)는 함께 "AND" 된다. 그러나 Q 객체가 제공되면 키워드 인수의 정의보다 선행돼야 한다. 예를 들어,

Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who',
)

다음과 같은 경우는 유효하지 않다.

# INVALID QUERY
Poll.objects.get(
    question__startswith='Who',
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
NOTE!
^ 는 XOR 이다.

참고

https://docs.djangoproject.com/en/4.1/topics/db/queries/#complex-lookups-with-q

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

'Django' 카테고리의 다른 글

Django 구조 잡기  (0) 2023.02.18
[DRF] SearchFilter  (0) 2023.02.16
[QuerySet] Built-in Expressions - F() 표현식 알아보기  (0) 2023.01.17
[Queryset] select_related와 prefetch_related 살펴보기  (0) 2023.01.13
[DRF] HyperlinkedModelSerializer 살펴보기  (0) 2023.01.12
    'Django' 카테고리의 다른 글
    • Django 구조 잡기
    • [DRF] SearchFilter
    • [QuerySet] Built-in Expressions - F() 표현식 알아보기
    • [Queryset] select_related와 prefetch_related 살펴보기
    r잡초처럼
    r잡초처럼
    오늘보다 내일 더 나은 개발자가 되기 위한 노력을 기록하는 블로그 입니다.

    티스토리툴바