[Django] 1차 프로젝트 필터링 기능 구현
술담화 페이지를 클론코딩하며, 상품 리스트 페이지에 대한 필터링 및 정렬 기능 구현을 맡게 됐습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | import json from django.http import JsonResponse from django.views import View from drinks.models import Drink # Create your views here. class FilteringView(View): def get(self, request): data = request.GET #쿼리 스트링 전체를 가져옴 def compute_reviews(drink): drink_reviews = drink.review_set.all() review_count = drink_reviews.count() sum_rating = 0 for review in drink_reviews: sum_rating += review.rating if review_count == 0: drink_average_review = 0 elif review_count != 0: drink_average_review = sum_rating / review_count return review_count, drink_average_review if data.get("ordering", None) == "-updated_at": recently_ordered_queryset = Drink.objects.all().order_by('-updated_at') data_ordered_list = [] for drink in recently_ordered_queryset: data_dict = {} data_dict["name"] = drink.name data_dict["price"] = drink.price review_count , drink_average_review = compute_reviews(drink) data_dict["average_rating"] = drink_average_review data_dict["review_count"] = review_count data_ordered_list.append(data_dict) return JsonResponse({'message':data_ordered_list}, status=200) elif data.get("Min_price", None) and data.get("max_price",None): price_range = [int(data.get("Min_price", None)), int(data.get("max_price",None))] qualified_drinks = Drink.objects.filter(price__range=(price_range[0],price_range[1]+1)) qualified_drinks_in_order = qualified_drinks.order_by('price') data_ordered_list = [] for drink in qualified_drinks_in_order: data_dict = {} data_dict["name"] = drink.name data_dict["price"] = drink.price review_count , drink_average_review = compute_reviews(drink) data_dict["average_rating"] = drink_average_review data_dict["review_count"] = review_count data_ordered_list.append(data_dict) return JsonResponse({'message':data_ordered_list}, status=200) elif data.get("filtering", None) == "caffeinated": drinks = Drink.objects.all() caffein_drinks = drinks.filter(caffeine__range =(1,10000)).order_by('caffeine') data_ordered_list = [] for drink in caffein_drinks: data_dict = {} data_dict["name"] = drink.name data_dict["price"] = drink.price review_count , drink_average_review = compute_reviews(drink) data_dict["average_rating"] = drink_average_review data_dict["review_count"] = review_count data_ordered_list.append(data_dict) return JsonResponse({'message':data_ordered_list}, status=200) elif data.get("filtering", None) == "decaffeinated": drinks = Drink.objects.all() decaffein_drinks = drinks.filter(caffeine = 0) data_ordered_list = [] for drink in decaffein_drinks: data_dict = {} data_dict["name"] = drink.name data_dict["price"] = drink.price review_count , drink_average_review = compute_reviews(drink) data_dict["average_rating"] = drink_average_review data_dict["review_count"] = review_count data_ordered_list.append(data_dict) return JsonResponse({'message':data_ordered_list}, status=200) elif data.get("ordering", None) == "-ratings": drinks = Drink.objects.all() drink_and_average_rating = {} for drink in drinks: review_count , drink_average_review = compute_reviews(drink) drink_and_average_rating[drink.name] = drink_average_review sorted_dict = sorted(drink_and_average_rating.items(), key=lambda x: x[1], reverse=True) sorted_key_list= [] for i in sorted_dict: sorted_key_list.append(i[0]) data_ordered_list = [] for name in sorted_key_list: data_dict = {} drink = Drink.objects.get(name=name) data_dict["name"] = drink.name data_dict["price"] = drink.price data_dict["average_rating"] = drink_and_average_rating[name] data_dict["review_count"] = drink.review_set.all().count() data_ordered_list.append(data_dict) return JsonResponse({'message':data_ordered_list}, status=200) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | from django.http import JsonResponse from django.views import View from django.db.models import Q from drinks.models import Drink # Create your views here. class ProductsView(View): def get(self, request): drinks = Drink.objects.all() q = Q() category = request.GET.get("category", None) caffeine = request.GET.get("caffeine", None) price_upper = request.GET.get("price_upper", 200000) price_lower = request.GET.get("price_lower", 0) if category: categories = category.split(',') q.add(Q(category__name__in = categories), Q.AND) if caffeine: if caffeine == "yes": q.add(Q(caffeine__gt=0), Q.AND) elif caffeine == "no": q.add(Q(caffeine__exact=0), Q.AND) q.add(Q(price__range = (price_lower, price_upper)),Q.AND) filtered_drinks = drinks.filter(q) recently = request.GET.get("recently", None) rating = request.GET.get("rating", None) def compute_reviews(drink): drink_reviews = drink.review_set.all() review_count = drink_reviews.count() sum_rating = 0 for review in drink_reviews: sum_rating += review.rating if review_count == 0: drink_average_review = 0 elif review_count != 0: drink_average_review = sum_rating / review_count return review_count, drink_average_review def make_whole_data_list(filtered_drinks): drink_and_average_rating = {} for drink in filtered_drinks: review_count , drink_average_review = compute_reviews(drink) drink_and_average_rating[drink.name] = drink_average_review whole_data_list = [{ "name" : drink.name, "price" : drink.price, "average_rating" : drink_average_review, "review_count" : review_count } for drink in filtered_drinks] return whole_data_list if recently: filtered_drinks = filtered_drinks.order_by('-updated_at') whole_data_list = make_whole_data_list(filtered_drinks) elif rating: drink_and_average_rating = {} for drink in filtered_drinks: review_count , drink_average_review = compute_reviews(drink) drink_and_average_rating[drink.name] = drink_average_review sorted_dict = sorted(drink_and_average_rating.items(), key=lambda x: x[1], reverse=True) sorted_key_list = [] for i in sorted_dict: sorted_key_list.append(i[0]) whole_data_list = [] for name in sorted_key_list: data_dict = {} drink = Drink.objects.get(name=name) data_dict["name"] = drink.name data_dict["price"] = drink.price data_dict["average_rating"] = drink_and_average_rating[name] data_dict["review_count"] = drink.review_set.all().count() whole_data_list.append(data_dict) else: whole_data_list = make_whole_data_list(filtered_drinks) return JsonResponse({'message':whole_data_list}, status = 200) |