본문으로 바로가기

쿼리 최적화

category TIL/team_project 2022. 12. 4. 02:08

프로젝트에서 리뷰시스템을 만들고있다. 사용자가 평가하면 평가점수가 -20 일때 평가당하는사람이 최근에도 안좋은 평가를 받았다면 정지를 하는 기능으로 기획했다. 쿼리를 너무 많이 사용한다고 판단해서 최적화를 했다.

    if score == -20:
        """
        평가받은 바이어가 최악의 점수를 받았다면 바이어의 최근 거래점수를 확인하고 연속적으로 비매너점수를 받았다면 정지를 시킨다.
        """
        buyer_goods_id = Goods.objects.filter(buyer_id=buyer_id) | Goods.objects.filter(seller_id=buyer_id)
        buyer_goods_id_value=buyer_goods_id.order_by('-created_at').values()[:2] # score 없으면 다른거 들고오게는 나중에
        first_buyer_goods_id = buyer_goods_id_value[1]['id']
        second_buyer_goods_id = buyer_goods_id_value[0]['id']
        first_reviews = Review.objects.filter(goods_id=first_buyer_goods_id).exclude(user_id=buyer_id)
        second_reviews = Review.objects.filter(goods_id=second_buyer_goods_id).exclude(user_id=buyer_id)
        try:
            if first_reviews.values()[0]['manner_score']+second_reviews.values()[0]['manner_score'] == -40:
                ban_user = User.objects.get(id = buyer_id)
                ban_user.is_active = 0
                ban_user.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
        except:
            return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        pass

 

우선 모델 컬럼추가해서 데이터 접근을 쉽게하고 user get 한번으로 최대한 사용

쿼리 하나 줄이고 -20이라는 점수 아닐때는 6개까지 줄일 수 있었다.

지금 만든 기능이 db 조작을 가하는 기능이기때문에 쿼리가 많을 수 있다고 생각도 한다.

다음엔 select_related 사용해서 쿼리를 더 줄여보도록 하겠다.

-20을 받지않았을때의 쿼리


 

참고문헌

https://docs.djangoproject.com/en/4.1/topics/db/queries/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com