모델을 통한 조회 (기초)

guava·2021년 11월 9일
0

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.

조회 요청하기

from instagram.models import Post

qs = Post.objects.all()
print(qs.query)  # 쿼리문이 출력된다.
# SELECT `instagram_post`.`id`, ... FROM `instagram_post`

다양한 조회 요청

qs = Post.objects.all()
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post`
qs = qs.order_by('-pk')
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` ORDER BY `instagram_post`.`id` DESC
qs = qs[:2]
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` ORDER BY `instagram_post`.`id` DESC LIMIT 2

필터링 (filter, exclude)

쿼리문에 WHERE 또는 WHERE NOT 이 삽입된다.

query = '메시지'  # 검색어
qs = Post.objects.all()
qs = qs.filter(message__icontains=query)
qs = qs.order_by('-pk')
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE `instagram_post`.`message` LIKE %메시지% ORDER BY `instagram_post`.`id` DESC

query = '메시지'  # 검색어
qs = Post.objects.all()
qs = qs.exclude(message__icontains=query) # qs.exclude()
qs = qs.order_by('-pk')
print(qs.query)
qs
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE NOT (`instagram_post`.`message` LIKE %메시지%) ORDER BY `instagram_post`.`id` DESC

and, or조건 추가하기

  • and 조건은 Q객체를 사용할 필요는 없다. 아래 예제에서 첫번째 쿼리와 두번째 쿼리가 같다.
  • Q객체를 사용한 후 비트 연산자를 이용해 and 또는 or연산을 할 수 있다. WHERE절AND 또는 OR가 출력된 걸 확인해볼 수 있다.
from django.db.models import Q

qs = Post.objects.all()
qs = qs.filter(id__gte=2, message__icontains=query)
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 AND `instagram_post`.`message` LIKE %메시지%)

qs = Post.objects.all()
qs = qs.filter(Q(id__gte=2) & Q(message__icontains=query))
print(qs.query) 
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 AND `instagram_post`.`message` LIKE %메시지%)

qs = Post.objects.all()
qs = qs.filter(Q(id__gte=2) | Q(message__icontains=query))
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 OR `instagram_post`.`message` LIKE %메시지%)

조건 쿼리에 대한 컨디션 객체를 가공해서 넘겨주는 패턴도 가능하다

cond변수에 Q객체를 정의해 두고 filter에 삽입할 수 있다.

qs = Post.objects.all()
cond = Q(id__gte=2) | Q(message__icontains=query)
# cond *= Q( ... )
qs = qs.filter(cond)
print(qs.query)
# SELECT `instagram_post`.`id`, ... FROM `instagram_post` WHERE (`instagram_post`.`id` >= 2 OR `instagram_post`.`message` LIKE %메시지%)

정렬 조건 추가하기

정렬 지정하기 1

모델 정의할 때 추가할 수 있다.

class Item(models.Model):
	# ...
    
    class Meta:
        ordering = ['id']

정렬 지정하기 2

queryset 코드에서 order_by를 지정한다. (모델에서의 정의는 무시된다.)

Item.objects.all().order_by('id')

정렬에 여러 조건을 지정하는 것은 데이터베이스 최적화에서는 권장하지 않는다.

order_by()에 여러 정렬 조건을 삽입할 수 는 있지만 1~2개가 적당하다.

0개의 댓글