60 DJango cached_property 사용하기
60.1 장고 cached_property 어노테이션
cached_property는
매번 모델을 호출할 때마다 발생하는
여러번의 쿼리를 캐싱하여,
한 번만 수행하도록 해주는 함수입니다.
모델의 메소드에 적용하면
모델 인스턴스가 살아있는 동안 캐싱되어
성능 최적화에 유용합니다.
59 트리구조 메뉴 만들기 에서
django-treebeard 패키지로 트리메뉴를 만들었습니다.
그런데 사이트 속도가 좀 저하된 느낌이라
디버그 모드로 살펴보았습니다.
60.2 장고 cached_property 어노테이션
디버그 모드로 SQL을 확인보니
1뎁스(Django 사이트만들기) 메뉴로 쓰는
py_blog 모델은 1번 조회 하는거에 비해
django-treebeard를 사용한
2뎁스(Python 코딩) 메뉴가 쿼리를 많이 사용하고 있습니다.
cached_property 를 모델에 적용해보겠습니다.
60.3 모델에 cached_property - models.py
이전글, 다음글에 cached_property를 적용합니다.
#myapp/coding/model.py
from django.db import models
from django.urls import reverse
from markdownx.models import MarkdownxField
from markdownx.utils import markdownify
from treebeard.mp_tree import MP_Node
from django.utils.functional import cached_property
IMG_SIZE_CHOICES = {(30,'30%'),(40, '40%'),(50, '50%'),(70, '70%'),(100, '100%')}
class PyCoding(MP_Node):
id = models.AutoField(primary_key=True)
# category = models.CharField(max_length=20,choices=CATEGORY_CHOICES, null=False, blank=False)
tags = models.CharField(max_length=200)
title = models.CharField(max_length=100)
sub_title = models.CharField(max_length=100, blank=True, null=True)
img_url = models.CharField(max_length=200, blank=True, null=True)
img_size = models.IntegerField(choices=IMG_SIZE_CHOICES, null=False, blank=False)
#content_body = models.TextField(null=False, blank=False)
content_body = MarkdownxField()
update_dt = models.DateTimeField(auto_now=True)
regist_dt = models.DateTimeField(auto_now_add=False)
node_order_by = ['regist_dt']
def get_absolute_url(self):
if not self.is_root():
return reverse('coding:coding_detail', kwargs={'pk':self.pk} )
@cached_property
def get_previous(self):
if not self.is_root():
return self.get_prev_sibling()
@cached_property
def get_next(self):
if not self.is_root():
return self.get_next_sibling()
def get_is_root(self):
return self.is_root()
def __str__(self):
return self.title
class Meta:
db_table = 'py_coding'
60.4 cached_property 적용 확인하기 - debug_toolbar
현재글 : 60 DJango cached_property 사용하기
Comments
Login: