우선 바로 menu를 위한 rest API셋업을 시작하고 데이터 값을 임의로 집어 넣도록 하겠습니다.
/fastcampus/order/views.py
from django.shortcuts import render
from order.models import Shop, Menu, Order, Orderfood
from order.serializer import ShopSerializer, MenuSerializer
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
# Shop객체들을 다 serialize한 결과를 json으로 parsing해서 json형태로 이를 반응하겠다
@csrf_exempt
def shop(request):
if request.method == 'GET':
shop = Shop.objects.all()
serializer = ShopSerializer(shop, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = ShopSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
@csrf_exempt
def menu(request):
if request.method == 'GET':
menu = Menu.objects.all()
# many=True는 값이 여러개여도 상관하지 않겠다는 의미이다.
serializer = MenuSerializer(menu, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = MenuSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
/fastcampus/order/serializer.py
from rest_framework import serializers
from order.models import Shop, Menu, Order, Orderfood
class ShopSerializer(serializers.ModelSerializer):
class Meta:
model = Shop
fields = '__all__'
class MenuSerializer(serializers.ModelSerializer):
class Meta:
model = Menu
fields = '__all__'
/fastcampus/order/urls.py
from django.urls import path
from order import views
urlpatterns = [
path('shops/', views.shop),
path('menus/', views.menu),
]
이렇게 한다음에 전과 같이 Postman으로 shop1, 2, 3에 대해 한식집, 일식집, 양식집으로 가정하고 적절한 음식 menu들을 집어 넣겠습니다.
이제 Shop, Menu에 대한 rest API를 작성했습니다. 이제 jinja template를 통해서 Shop에 대한 목록을 볼 수 있게 하고, 각 Shop을 클릭하면 Shop에 포함되어 있는 메뉴를 보이게 해보겠습니다.
구현
/fastcampus/order/views.py
from django.shortcuts import render
from order.models import Shop, Menu, Order, Orderfood
from order.serializer import ShopSerializer, MenuSerializer
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
# Shop객체들을 다 serialize한 결과를 json으로 parsing해서 json형태로 이를 반응하겠다
@csrf_exempt
def shop(request):
if request.method == 'GET':
# shop = Shop.objects.all()
# serializer = ShopSerializer(shop, many=True)
# return JsonResponse(serializer.data, safe=False)
shop = Shop.objects.all()
return render(request, 'order/shop_list.html', {'shop_list': shop})
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = ShopSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
@csrf_exempt
def menu(request, shop):
if request.method == 'GET':
# get으로 하게 되면 menu1개 밖에 불러오지 못하게 된다.
# 모든 menu를 불러오고 싶을 떄는 배열로서 filter를 사용해 주면 된다.
menu = Menu.objects.filter(shop=shop)
# many=True는 값이 여러개여도 상관하지 않겠다는 의미이다.
# serializer = MenuSerializer(menu, many=True)
# return JsonResponse(serializer.data, safe=False)
return render(request, 'order/menu_list.html', {'menu_list': menu})
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = MenuSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
각각의 GET요청에 따라 직접 만든 shop_list.html, menu_list.html을 렌더링하고 각각에 필요한 data의존성을 주입해 주었습니다.
/fastcampus/order/templates/order/shop_list.html
{% for shop in shop_list %}
<h5 ><a href="{% url 'menu' shop.id %}">{{ shop.shop_name }}</a></h5>
<h5>{{ shop.shop_address }}</h5>
{% endfor %}
/fastcampus/order/templates/order/menu_list.html
{% for menu in menu_list %}
<h5>{{ menu.food_name }}</h5>
{% endfor %}
그리고 이를 위한 urls.py를 수정해 보도록 하겠습니다.
/fastcampus/order/urls.py
from django.urls import path
from order import views
urlpatterns = [
path('shops/', views.shop, name="shop"),
path('menus/<int:shop>/', views.menu, name="menu"),
]
shops과 menus에 각각 name을 지정해 주었고, menus는 shop의 id와 함께 요청하게 바꾸었습니다.
그럼 /order/shops로 들어가서 어떤 페이지가 있나 확인해 봅시다.
각각의 링크는 order/menus/[1 | 2 | 3]으로 링크 됩니다.
완벽하게 정상 작동하는 것을 확인할 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Order백엔드 개발 3 (0) | 2022.06.29 |
---|---|
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Order백엔드 개발 2 (0) | 2022.06.29 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Models 제작 (0) | 2022.06.28 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Django 기초 - 3 (0) | 2022.06.28 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Django 기초 - 2 (0) | 2022.06.28 |