users = User.objects.all()
orders = Order.objects.all()
user_list = list(users)
장고 ORM은 정말 필요한 만큼만 호출한다.
쿼리셋을 선언하면 선언 시점에는 쿼리셋에 지나지 않는다. 실제로 유저 리스트가 넘어오는 시점은 리스트로 묶어주고 사용하는 시점!!
하나의 쿼리셋을 불러올때 related object를 불러와 미리 캐시에 넣기 때문에
쿼리 갯수를 줄일 수 있다!!! DB에 접근 하는 횟수가 줄기 때문에 속도도 up!!!!
쿼리 최적화를 위해 필수적이다!
여러개 set의 오브젝트를 불러올때 사용 -> ManyToManyField
, reverse ForeignKey
def get(self, request):
user = request.user
header = Header.objects.by_user(user=user.id).prefetch_related('header').order_by('-created_at')
header_serializer = HeaderSerializer(header, many=True, context={'header':header}).data
return Response(header_serializer, status=200)
단일 오브젝트를 불러올때 사용 -> OneToOneField
, ForeignKey
당연히 1개의 쿼리를 가져오는 selected_related가 더 좋음!! :)
def get(self, request):
articles = Article.objects.all()
top_articles = articles.annotate(like_count=Count('like')).annotate(comment_count=Count('comment')).order_by('-like_count')[:9]
top_articles = ArticleSerializer(top_articles, many=True)
return Response(top_articles.data, status=status.HTTP_200_OK)
annotate의 뜻은 주석을 달다. 보통 주석을 annotation이라고 하니까ㅇㅇ
마치 엑셀에서 컬럼을 하나 새로 만드는 것과 같다는 한 블로그 글을 봤는데 꽤 그럴듯하다고 생각된다.
우리 수식에서는 Count를 사용했지만 다른 장고 모델 메소드도 사용 가능하다.
from django.db.models import F, Sum, Count, Case, When
같은 것 말이다.
좀 더 실험을 해볼 가치가 있는것 같다.