jiiheee's 개발 일지

[Django] 주문내역조회 API 구현하기 본문

📚 Study/Django

[Django] 주문내역조회 API 구현하기

◼️ 2023. 12. 12. 23:44

목표 

  • 요청자가 주문한 내역 모두 보여주기

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 조건을 추가해 준다.