jiiheee's 개발 일지
[Django] 주문내역조회 API 구현하기 본문
목표
- 요청자가 주문한 내역 모두 보여주기
Reservation / urls.py 및 views.py 수정
먼저 주문 내역 상세 urls를 추가하기 전에 기존에 주문 상세 조회 API 만들 때 사용한 urls를 수정해야 한다고 생각했다.
기존에 사용했던 urls는 reservation_id만 받아서 조회하는 방법을 사용했었는데,
이 방법으로는 추후에 많은 데이터를 사용할 시 혼동을 줄 수 있다고 판단하여
user_id와 reservation_id를 동시에 받아서 검색하는 방법으로 수정하였다.
<기존 urls.py>
from django.urls import path
from .views import ReservationView
from . import views
urlpatterns = [
path("<int:reservation_id>", ReservationView.as_view())
]
<수정 후 urls.py>
from django.urls import path
from .views import ReservationView
from . import views
urlpatterns = [
path("<int:user_id>/<int:reservation_id>", ReservationView.as_view())
]
요청자로부터 '한 개'의 data를 받는 urls에서 '두 개'의 data를 받는 urls로 수정하였으니
views.py도 수정해야 한다.
request로부터 한 개의 data를 받을 때는 한 가지의 조건만 일치해도 가져올 수 있지만,
두 개의 data를 받을 때에는 두 개의 조건 모두 만족해야 하기 때문에 exept인 경우를 취급해야 한다.\
즉,
id=reservation_id, user__id=user_id 조건 모두 갖췄을 경우
정상적으로 코드를 진행하게 try로 묶고 (정상적으로 코드가 진행될 경우 status=200),
한 가지의 조건만 충족했을 경우
'해당 고객이 주문한 주문내역이 아닙니다.'라는 문구와 함께 status=400을 보낸다.
<기존 views.py>
from rest_framework.response import Response
from rest_framework.views import APIView
from reservation.models import Reservation
from .serializers import ReservationSerializer
class ReservationView(APIView):
def get(self, request, reservation_id:int):
reservation_data = Reservation.objects.get(id=reservation_id)
serializer = ReservationSerializer(reservation_data)
return Response(serializer.data)
# request로부터 reservation_id 한 개의 data만 받아옴
<수정 후 views.py>
from django.http import HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from reservation.models import Reservation
from .serializers import ReservationSerializer
class ReservationView(APIView):
def get(self, request, user_id: int, reservation_id: int):
try:
reservation_data = Reservation.objects.get(id=reservation_id, user__id=user_id)
"""
user__id는 User의 속성에서 가져온 조건이기 때문에 언더바 두개 사용
"""
except Exception as e:
return Response("해당 고객이 주문한 주문내역이 아닙니다.", status=400)
serializer = ReservationSerializer(reservation_data)
return Response(serializer.data, status=200)
# request로부터 reservation_id, user_id 두 개의 data를 받아옴
또한, reservation_data = Reservation.objects.get(id=reservation_id, user__id=user_id) 이 부분에서
get으로 data를 가져올 때 괄호 안에 조건에서 등호를 기준으로 왼쪽은 Reservation이 갖고 있는 속성을 써야 하므로 Reservation의 models.py에 속해있는 속성이어야 한다.
Reservation models의 속성 중 user는 User models.py에서 realname을 가져와 보여줄 것이기 때문에 언더바를 두 개 사용하여 user의 속성에서 id인 것이라는 표시를 해준다.
<Reservation / models.py>
from django.db import models
class Reservation(models.Model):
reservation_number = models.CharField(max_length = 200)
user = models.ForeignKey("user.User", on_delete=models.CASCADE, db_column="user_id")
product = models.ForeignKey("product.Product", on_delete=models.CASCADE, db_column="product_id")
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now_add=True)
<User / models.py>
from django.db import models
class User(models.Model):
realname = models.CharField(max_length = 200)
password = models.CharField(max_length=200, default='1234')
phone = models.CharField(max_length =200)
mail = models.CharField(max_length =200)
is_active = models.BooleanField(default=True, null=False)
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now_add=True)
Reservation / urls.py 'ReservationList' 추가
from django.urls import path
from .views import ReservationView, ReservationListView
from . import views
urlpatterns = [
path("<int:user_id>/<int:reservation_id>", ReservationView.as_view()),
path("<int:user_id>", ReservationListView.as_view())
]
Reservation / views.py 'ReservationListView' 추가
from django.http import HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from reservation.models import Reservation
from .serializers import ReservationSerializer
class ReservationView(APIView):
def get(self, request, user_id: int, reservation_id: int):
try:
reservation_data = Reservation.objects.get(id=reservation_id, user__id=user_id)
except Exception as e:
return Response("해당 고객이 주문한 주문내역이 아닙니다.", status=400)
serializer = ReservationSerializer(reservation_data)
return Response(serializer.data, status=200)
class ReservationListView(APIView):
def get(self, request, user_id: int):
order_list = Reservation.objects.filter(user__id=user_id)
serializer = ReservationSerializer(order_list, many=True)
return Response(serializer.data)
주문 내역 조회할 경우, user가 주문한 내역을 모두 보여줘야 하므로 filter로 가져오며
주문 내역을 모두 가져올 것이기 때문에 many=True 조건을 추가해 준다.
'📚 Study > Django' 카테고리의 다른 글
[Django] 물품 검색 API 구현하기 (0) | 2023.12.14 |
---|---|
[Django] 주문 취소 API 구현하기 (0) | 2023.12.13 |
[Django] 주문 등록 API 구현하기 (0) | 2023.12.13 |
[Django] 회원가입 API 구현하기 (2) (4) | 2023.12.07 |
[Django] 회원가입 API 구현하기 (1) (0) | 2023.12.06 |