Skip to content

Latest commit

 

History

History
175 lines (108 loc) · 4.63 KB

Django - ORM 쿼리개선.md

File metadata and controls

175 lines (108 loc) · 4.63 KB

쿼리개선

  • 게시글 10개

  • 댓글 10*10개

  • 필수 라이브러리 : django debug toolbar

    $ pip install django-debug-toolbar
    • 설정 방법은 문서를 통해 익혀보세요 :)

0. 관련 문서

1. 댓글 수

개선전(11번)

articles = Article.objects.order_by('-pk')
<p>댓글 수 : {{ aritcle.comment_set.count }}</p>

Screen Shot 2020-05-04 at 오후 3 36

개선후(1번)

articles = Article.objects.annotate(comment_set_count=Count('comment')).order_by('-pk')
<!-- 주의! comment_set_count로 호출 -->
<p>댓글 수 : {{ article.comment_set_count }}</p>

Screen Shot 2020-05-04 at 오후 3 37

2. select_related

게시글을 작성한 사람을 출력하자.

select_related 는 SQL JOIN을 통하여 데이터를 가져온다.

1:1, 1:N관계에서 참조관계 (N->1, foreignkey가 정의되어 있는 곳)

개선전(11번)

articles = Article.objects.order_by('-pk')
<h3>{{ article.user.username }}</h3>

Screen Shot 2020-05-04 at 오후 3 38

개선후(1번)

articles = Article.objects.select_related('user').order_by('-pk')
<!-- 변경 없음 -->
<h3>{{ article.user.username }}</h3>

Screen Shot 2020-05-04 at 오후 3 42 - 2

3. prefetch_related

게시글마다 댓글을 출력하자.

prefetch_related 는 python을 통한 Join으로 데이터를 가져온다.

M:N, 1:N관계에서 역참조관계(1->N)

개선전(11번)

articles = Article.objects.order_by('-pk')
{% for comment in article.comment_set.all %}
	<p>{{ comment.content }}</p>
{% endfor %}

Screen Shot 2020-05-04 at 오후 3 42

개선후(2번)

articles = Article.objects.prefetch_related('comment_set').order_by('-pk')
<!-- 변경 없음 -->
{% for comment in article.comment_set.all %}
	<p>{{ comment.content }}</p>
{% endfor %}

Screen Shot 2020-05-04 at 오후 3 42 - 2

4. 게시글의 댓글마다 사람의 이름과 댓글을 출력

개선전(111번)

![Screen Shot 2020-05-04 at 오후 3.48](스크린샷/Screen Shot 2020-05-04 at 오후 3.48.pngarticles = Article.objects.order_by('-pk')
![Screen Shot 2020-05-04 at 오후 3.49](스크린샷/Screen Shot 2020-05-04 at 오후 3.49.png{% for comment in article.comment_set.all %}
	<p>{{ comment.user.username }} : {{ comment.content }}</p>
{% endfor %}

Screen Shot 2020-05-04 at 오후 3 48

개선후(2번)

from django.db.models import Prefetch

articles = Article.objects.prefetch_related(
    	Prefetch('comment_set'),
		queryset=Comment.objects.select_related('user')
	).order_by('-pk')
{% for comment in article.comment_set.all %}
	<p>{{ comment.user.username }} : {{ comment.content }}</p>
{% endfor %}

Screen Shot 2020-05-04 at 오후 3 49