프로젝트에서 리뷰시스템을 만들고있다. 사용자가 평가하면 평가점수가 -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/
'TIL > team_project' 카테고리의 다른 글
정독하면서 코딩 공부하기 | 정보수정시 데이터 받아와서 넣어주기 | 모든게 도움이 된다! (0) | 2022.12.15 |
---|---|
project 리뷰, 회원제재 기능을 만들면서 했던 생각들 + 개선점 (1) | 2022.12.13 |
TeamProject 매너평가, 비매너회원 관리 계획 (0) | 2022.12.02 |
Team B3 STADY project recommedation system KPT (0) | 2022.11.08 |
STADY Project (0) | 2022.10.21 |