def get_object(self):
review = super().get_object()
# 조회수 1 증가
review.watch += 1
review.save()
return review
이와 같이 객체를 가져와서 속성을 변경한 뒤 저장(update)을 하는 로직이다.
그런데 무려 4ms나 걸린다. 어떻게든 줄여야겠다는 생각이 든다.
DetailView라서 watch 속성만 가져오는 건 불가능하다. name을 비롯해 여러 속성이 보여야 한다.
생각을 해보다가 마땅한 방법이 없어서 celery가 나중에 처리해주는 방식을 선택했다.
덕분에 update query 작업이 없어져서 6ms -> 2ms로 로딩 속도를 줄일 수 있었다.
def get_object(self):
review = super().get_object()
# 조회수 1 증가
increase_watch.delay(review.id)
return review
아래는 조회수 증가를 위해 따로 만들어준 tasks.py 파일이다.
from celery import shared_task
from reviewzip.models import Review
@shared_task
def increase_watch(review_id):
review = Review.objects.only('watch').get(id=review_id)
review.watch += 1
review.save()
field update는 비동기 celery를 이용하는 게 좋다고 본다.
'django' 카테고리의 다른 글
TypeError: 'Manager' object is not callable 발생 시 objects를 확인하자 (0) | 2021.02.11 |
---|---|
django query 최적화 시키기 - prefetch_related (0) | 2021.02.11 |
django rest framework pagination 안 되는 문제 해결 (0) | 2021.02.07 |
[윈도우] celery가 작동을 안 하는 이유, 해결책 (0) | 2021.02.03 |
visual studio code 쓰면 python manage.py runserver 안 쳐도 된다 (0) | 2021.01.31 |