django orm에서 Q 객체를 사용하면 OR/AND 조건을 적용할 수 있습니다.
- Q 객체는 복잡한 조건식을 표현할 수 있도록 도와주는 객체로, 논리 연산자 (|, &, ~)를 사용할 수 있습니다1. 예를 들어, filter(Q(name=“lee”) | Q(age__gt=20))는 name이 "lee"이거나 age가 20보다 큰 레코드를 필터링합니다1.
- Q 객체는 filter(), exclude(), get() 등의 메소드에 인자로 전달할 수 있습니다2. Q 객체끼리는 연결하여 사용할 수 있습니다2. 예를 들어, filter(Q(name=“lee”) & Q(age__gt=20), Q(gender=“M”))는 name이 "lee"이고 age가 20보다 크며 gender가 "M"인 레코드를 필터링합니다2.
- Q 객체는 F 표현식과 함께 사용할 수 있습니다3. F 표현식은 모델의 필드 값을 참조할 수 있도록 해주는 객체입니다3. 예를 들어, filter(Q(name=F(‘age’)))는 name과 age 필드 값이 같은 레코드를 필터링합니다3.
예제코드
# django orm에서 Q 객체 사용하기
from django.db.models import Q, F
from blog.models import Blog
# 블로그 제목에 'django'가 포함되거나 작성자가 'lee'인 쿼리
blogs = Blog.objects.filter(Q(title__contains='django') | Q(author='lee'))
# 블로그 내용에 'python'이 포함되지 않고 생성일자가 현재보다 과거인 쿼리
blogs = Blog.objects.exclude(Q(content__contains='python') & Q(created_date__gt=timezone.now()))
# 블로그 제목과 내용이 같은 쿼리
blogs = Blog.objects.filter(Q(title=F('content')))
Q 객체와 SQL 문의 성능 차이
- Q 객체는 SQL 문을 생성하기 전에 파이썬 레벨에서 조건식을 표현하는 방법입니다1.
- Q 객체를 사용하면 복잡한 논리 연산을 쉽게 작성할 수 있습니다1.
- SQL 문의 성능은 작성 방식과 데이터베이스 엔진에 따라 달라집니다.
- Q 객체와 SQL 문의 성능 차이는 크지 않습니다2. 하지만 Q 객체는 파이썬 코드로 작성되기 때문에 가독성과 유지 보수성이 더 좋습니다2. SQL 문은 데이터베이스에 의존적이기 때문에 이식성이 떨어질 수 있습니다.
예제코드
# Q 객체를 사용한 예
from django.db.models import Q
blogs = Blog.objects.filter(Q(title__contains='django') | Q(author='lee'))
# SQL 문을 사용한 예
blogs = Blog.objects.raw("SELECT * FROM blog WHERE title LIKE '%django%' OR author = 'lee'")
참고사이트
django 복잡한 filter 조건 연결할 때 Q object 를 이용해 봅시다.
Django 장고 ORM으로 OR/AND 사용하기(Q 사용)
'IT > 파이썬' 카테고리의 다른 글
파이썬 코드 웹 실행 사이트 (0) | 2023.04.25 |
---|---|
파이썬 - 바이트 배열을 정수형 변환 코드 예제 (0) | 2023.04.25 |
Django ORM - 중복 레코드 제거 방법 (0) | 2023.04.18 |
파이썬 라이브러리 패키지 업데이트 방법 - 한꺼번에 여러개 (0) | 2021.11.17 |
CircuitPython - UART read / write 시리얼 읽고 쓰기 (0) | 2021.08.19 |