Django QuerySet aggregate 사용해 합계 구하기

Jay·2020년 4월 5일
2

호텔 예약 사이트 클론 프로젝트(선릉호텔)에서 회원이 방을 예약할 경우, 회원 등급에 따른 적립률로 포인트가 쌓이고, 마이페이지에서 포인트 적립 / 사용 내역을 확인할 수 있는 기능을 구현 했다. 총 포인트 금액 = 총 적립 금액 - 사용 금액 이고, 총 포인트 금액을 구현하기 위해 sum을 사용했다. (그런데 지금 생각해보니 굳이 total point 컬럼을 만들 필요는 없었던것 같다.)

from django.db.models import Sum

user_point = User.objects.prefetch_related('point_set').get(id = request.user.id).point_set.all()
total_saved_point = user_point.aggregate(Sum('saved_point'))['saved_point__sum']
total_used_point = user_point.aggregate(Sum('used_point'))['used_point__sum']
            
if User.objects.prefetch_related('point_set').get(id = request.user.id).point_set.all() :
	Point(
		user            = request.user,
		reservation     = reserve_id, 
		saved_point     = saved_one,
		total_point    = saved_one + total_saved_point - total_used_point
                ).save()
else :
	Point(
		user        = request.user,
		reservation = reserve_id, 
		saved_point = saved_one,
		total_point = saved_one
                ).save()
                
return JsonResponse({'Message':'Reservation Succeed'}, status = 200)
                

aggregate는 sum 말고 갯수 카운트, 평균값, 최대값, 최소값을 구할 수도 있다.

from django.db.models import Avg, Max, Min

>>> Point.objects.all().aggregate(Max('saved_point'))
{'saved_point__max': 313500}

>>> Point.objects.all().aggregate(Min('saved_point'))
{'saved_point__min': 313}

>>> Point.objects.all().aggregate(Avg('saved_point'))
{'saved_point__avg': 112536.5625}

참고 : https://docs.djangoproject.com/en/1.11/topics/db/aggregation/

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

0개의 댓글