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_related
로 stat
정보를 가져와서 DB를 계속 왔다갔다 하지 않도록 작성하였습니다.