파이썬/장고 웹서비스 개발 완벽 가이드 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
쿼리문에 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
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 %메시지%)
모델 정의할 때 추가할 수 있다.
class Item(models.Model):
# ...
class Meta:
ordering = ['id']
queryset 코드에서 order_by를 지정한다. (모델에서의 정의는 무시된다.)
Item.objects.all().order_by('id')
정렬에 여러 조건을 지정하는 것은 데이터베이스 최적화에서는 권장하지 않는다.
order_by()
에 여러 정렬 조건을 삽입할 수 는 있지만 1~2개가 적당하다.