[2차 프로젝트] 상세페이지 불러오기 기능 구현

이태연·2021년 12월 19일
0

2차 프로젝트에서 제가 구현하기로 한 기능은 좋아요 기능,상세페이지 정보 불러오기 기능,리스트페이지 정보 불러오기 기능 입니다.

이번 포스팅에서는 상세페이지 정보GET API에 대해 작성하겠습니다.

제가 작성한 코드는 다음과 같습니다.

class ProductView(View):
    @AuthorizeProduct
    def get(self,request,course_id):
        try:
            course=Course.objects.get(id=course_id)
            stats=course.coursestat_set.all().select_related('stat')
            media = course.media_set.get()
            
            results={
                "course_id"      : course.id,
                "sub_category"   : course.sub_category.name,
                "course_name"    : course.name,
                "thumbnail_url"  : course.thumbnail_image_url,
                "page_image"     : media.url,
                "course_level"    : course.level.level,
                "price"          : course.price,
                "payment_period" : course.payment_period,
                "discount_rate"  : "30%",
                "discount_price" : course.price / 3,
                "course_like"    : course.like_set.count(),
                "course_stat"   : [{"stat_name" : c_stat.stat.name,"score" : c_stat.score} for c_stat in stats],
                "is_like_True"   : True if course.like_set.filter(user_id=request.user).exists() else False,
                "user_name"      : course.user.name,
                "profile_image"  : course.user.profile_image
               }
                

            return JsonResponse({"results" : results}, status=200)

        except Course.DoesNotExist:
            return JsonResponse({"message" : "INVALID_COURSE"},status=401)

불러오려고 하는 course_id를 paht parameter로 받아서 그 course에 해당하는 정보를 불러오면 되는 API였습니다.

1차 프로젝트때도 비슷한 기능을 구현해봤기 때문에 크게 어려움은 없었지만

"course_stat"   : [{"stat_name" : c_stat.stat.name,"score" : c_stat.score} for c_stat in stats]

해당 정보를 불러올 때 처음에는

stats=course.coursestat_set.all()

이렇게 courestat테이블에 있는 정보만 가져와서 작성하려고 했는데 그렇게 되면 stat에 대한 정보를 가져올 때 DB를 계속 왔다갔다 해야 됐기 때문에

stats=course.coursestat_set.all().select_related('stat')

select_relatedstat정보를 가져와서 DB를 계속 왔다갔다 하지 않도록 작성하였습니다.

profile
주니어 백엔드 웹 개발자입니다.

0개의 댓글