[Django] 스타벅스 뷰 작성하기

뷰는 작성된 모델을 바탕으로, 들어오는 데이터를 어떻게 처리할지에 대한 논리를 맡고 있다.
이제부터 스타벅스 제품 모델을 작성한 것에 이어 뷰를 작성해보자.

View 작성 포인트

1. Django Shell에서 먼저 연습하기

shell에서 작동하는 코드는 view에서도 유효하다. 무작정 view 로직부터 작성하지 말고, shell에서 충분히 연습해보자! 연습이 제대로 안 된 것 같다 싶으면 다시 shell으로 돌아가자.
예를 들어 각각의 쿼리셋 메소드가 어떤 형태의 값을 반환하는지, one-to-many 관계에서 참조하는 값은 어떻게 불러오는지 등 말이다.

2. 에러 잘 처리하기

서버 쪽 에러가 나면 500 Error가 발생하고 로직이 중단되기 때문에 에러가 날 경우를 미리 테스트해서 방지해야 한다.

에러를 처리하는 방법에는 try, except문 또는 if문 방식이 있다.
에러가 이미 발생되고 except로 처리하는 것보다 에러가 발생할 경우를 미리 if문으로 대비하는 게 낫다. 에러가 실제로 발생하는 경우를 줄이는 것이 낫기 때문이다.

3. 컨벤션 잘 맞추기

컨벤션을 맞추면서 코드를 작성하면 코드가독성도 좋아지고 나중에 리펙토링할 때도 편리하다.

장고 공식문서 코드 컨벤션 참고

뷰 작성하기

모듈 import

python 모듈, django 모듈, 내가 만든 클래스 순서대로 내가 필요한 모듈을 import해서 사용한다.

import json

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

from products.models import (
    Menu,
    Category,
    Product,
    Image,
    Allergy,
)

MenuView

class MenuView(View):
    def get(self, request):
        menu = list(Menu.objects.values())
            
        return JsonResponse({'data':menu}, status=200)
    
    def post(self, request):
        data = json.loads(request.body)
        menu_name = data.get('name', None)
        print(menu_name)
        if not menu_name:
            return JsonResponse({'MESSAGE': 'KEY_ERROR'}, status=400)
        
        if Menu.objects.filter(name=data['name']).exists:
            return JsonResponse({'message': 'ALREADY_EXISTS'}, status=409)
        
        Menu.objects.create(name=menu_name)
        return JsonResponse({'MESSAGE' : 'SUCCESS'}, status=200)
    

CategoryView

class CategoryView(View):
   def get(self, request):
           menu= list(Category.objects.create())
           
           return JsonResponse({'data':menu}, status=200)
   
   def post(self,request):
           data = json.loads(request.body)
           category_name=data.get('name', None)
           menu_name=data.get('menu_name', None)
       
           if not (category_name and menu_name):
               return JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status=400)
           
           if Category.objects.filter(name=category_name).exists():
               return JsonResponse({'MESSAGE' : 'KEY_ERROR'}, status=400)
           
           if not Menu.objects.filter(name=menu_name).exists():
               return JsonResponse({'MESSAGE':'FOREIGN_KEY_DOES_NOT_EXIST'}, status=404)

           menu = Menu.objects.get(name=menu_name)
           
           Category.objects.create(
                   name=category_name,
                   menu=menu
           )
           return JsonResponse({'MESSAGE':'SUCEESS'}, status=201)

ProductView

    def post(self, request):
        data = json.loads(request.body)

        name          = data.get('product_name', None)
        description   = data.get('description', None)
        category_name = data.get('category', None)

        if not (name and description and category_name): 
            return JsonResponse({'message': 'KEY_ERROR'}, status=400)

        if not Category.objects.filter(name=category_name).exists():
            return JsonResponse({'message': 'DOES_NOT_EXIST'}, status=404)

        category = Category.objects.get(name=data.get('category'))

        product = Product.objects.create(
            name         = name,
            description  = description,
            category     = category
        )

        return JsonResponse({'message': 'SUCCESS'}, status=201)

URL 지정하기

루트디렉토리의 URL

starbucks/urls.py

from django.urls import path, include

urlpatterns = [
    path('products', include('products.urls'))
]

해당 앱의 URL

products.urls.py

from django.urls import path
from .views      import MenuView,CategoryView,ProductView

urlpatterns = [
    path('/menu', MenuView.as_view()),
    path('/category', CategoryView.as_view()),
    path('/product', ProductView.as_view())
      
]

좋은 웹페이지 즐겨찾기