될때까지

((TURTLE HOME)) 4일차 : SubCategoryView 본문

프로젝트/wecode1차 : TURTLE-HOME

((TURTLE HOME)) 4일차 : SubCategoryView

랖니 2022. 7. 22. 07:17
728x90

첫번째 시도

  • 사용자로부터 category_id를 전달받는다.
  • SubCategory 객체들 중에서 category_id가 일치하는 객체를 찾는다. 
  • get()은 객체로 반환하고, 객체가 존재하지 않는 경우에 따른 객체.DoesNotExist에러를 일으킨다. 
  • filter()는 쿼리셋에 담아 반환하기 때문에 데이터가 비어있으면 빈 쿼리셋을 반환한다. 그래서 비어있을 때(없을 때)에 대해 핸들링 해야한다.
  • SubCategory중 category_id가 일치하는 객체가 존재한다면, 해당 객체의 정보들을 담아 json형식으로 보내주면 된다.
# Create your views here.

from django.http  import JsonResponse
from django.views import View

from products.models import SubCategory


class SubCategoryView(View):
    def get(self, request, category_id):   # 클라이언트에서 값을 보내주면 그 값을 받는 자리를 만들어줘야한다
        
        # 클라이언트가 누른 카테고리 값 잘 들어왔나 확인하기
        # print(category_id)
        
        subcategories = SubCategory.objects.filter(category_id=category_id)
        result = []
        
        # 클라이언트가 누른 카테고리의 값이 서브카테고리 객체중에 없다면 => 예외처리해줘야한다 없는 데이터에 접근한다.
        if not subcategories:
            return JsonResponse({'message':'Subcategory does not exist.'}, status=401)
        
        # 클라이언트가 누른 카테고리의 값이 서브카테고리 객체중에 있으면 아래 코드를 실행
        for subcategory in subcategories:
            result.append({
                'id'         : subcategory.id,
                'name'       : subcategory.name,
                'image_url'  : subcategory.image_url,
                'category_id': category_id,
            })
        
        return JsonResponse({'message':result}, status=200)
# zara>urls.py

from django.urls import path, include

from products.views import SubCategoryView

urlpatterns = [
    path("categories/<int:category_id>/subcategories", SubCategoryView.as_view())
]

 

두번째 시도(with 멘토님)

JsonResponse 시 message이 응답이 어떤 응답인지에 대한 설명글을 적을 때 사용하고, 실제 데이터를 담아 보내줄때는 data나 result라는 키워드를 사용하는 게 적합하다.

from django.http  import JsonResponse
from django.views import View

from products.models import Product, SubCategory

# Create your views here.

class SubCategoryView(View):
    def get(self, request, category_id):  
        
        subcategories = SubCategory.objects.filter(category_id=category_id)
        
        if not subcategories:
            return JsonResponse({'message':'Subcategory does not exist.'}, status=400)
        
        result = [{ 
                    'id'         : subcategory.id,
                    'name'       : subcategory.name,
                    'image_url'  : subcategory.image_url,
                    'category_id': category_id } for subcategory in subcategories]
        
        return JsonResponse({'result':result}, status=200)

 

# 어려웠던 점

  • users 앱과 products앱 2가지를 만들어서 자라홈을 구현하고 있었다. SubCategoryView를 구현할 때, 클라이언트로부터 대카테고리의 id값을 어떻게 받아올 까 고민했다. 찾아봤더니 클라이언트로부터 url을 받을 때 전달되는 id값을 변수에 담고, SubCategoryView에 get메소드 요청 시 전달해주면 됐다.
  • .gitignore에 올렸는데도 파일이 추적이 되고 있네? -> 해결방법
  • shell로 CSV를 집어넣는 데 조회하면 있는 컬럼인데 왜 없는 컬럼이라고 뜨지? -> 해결방법
  • products앱 안에서 SubCategoryView를 작업하고 있었다. 처음 url주소를 '/products'로 끊었기 때문에 여기서 계속 작업한다면 주소가 '/products/subcategories/<int:category_id>'이 된다.
  • 내 생각 RESTful한 API를 위해서는 '/categories/<int:category_id>/subcategories' 로 만들고 싶었다. 방법이 없을까 고민했는데 처음 url주소를 세팅할 때, 앱이름.urls로 연결하지 않고 바로 뷰로 연결할 수 있다고 해서 해결했다. 즉, url 주소를 프로젝트단에서도 뷰로 바로 연결할 수 있었다.
728x90