jiiheee's 개발 일지

[Django] 물품 검색 API 구현하기 본문

📚 Study/Django

[Django] 물품 검색 API 구현하기

◼️ 2023. 12. 14. 18:00

목표

  • 물품명 검색으로 모든 물품 목록 보여주기

Product / urls.py  'ProductSearchView' 추가

from django.urls import path
from . import views
from .views import ProductSearchView

urlpatterns = [
    path("<int:product_id>", views.get_remain_stock, name="get_remain_stock"),
    path("search/<str:product_name>", ProductSearchView.as_view())
]

Product  serializers.py 생성

물품명으로 등록된 모든 상품을 다 보여줄 것이기 때문에 serializers.py을 생성한다.

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=True)
    name = serializers.CharField(required=True)
    price = serializers.IntegerField(required=True)
    sales_stock = serializers.IntegerField(required=True)
    remain_stock = serializers.IntegerField(required=True)
    created_at = serializers.DateTimeField(required=True)

    class Meta:
        model = Product
        fields = (
            'id',
            'name',
            'price',
            'sales_stock',
            'remain_stock',
            'created_at'
        )

 

이 과정에서 두가지 문제가 있었다.

 

첫 번째 문제: 오타

이 실수는 코드를 짜면서 굉장히 자주 있는 실수이다. 글자 한 개가 코드 전체에 영향을 미치기 때문에 항상 주의를 하면서도 항상 오타가있다... 보통 함수같은 경우는 몇 글자 작성하면 자동완성이 있어서 오타가 거의 없는데, fields 작성할 때 자주 보인다. 앞으로 작성하면서도 확인하고 다 작성후 한 번 더 체크하는 습관으로 실수를 줄여야겠다.

 

두 번째 문제: 'Product' object has no attribute 'product_id'

ProductSerializer를 정의하면서 'id'를 'product_id'로 작성했던 것이 문제였다. 그냥 'id'로 작성하면 어떤 id인지 헷갈릴 것 같았는데 Product DB에 저장되어 있는 이름을 사용해야한다.


Product / views.py 'ProductSearchView' 추가

from django.http import HttpResponse
from product.models import Product
from rest_framework.views import APIView
from .serializers import ProductSerializer
from rest_framework.response import Response

# ... (중간 코드 생략)

class ProductSearchView(APIView):
    def get(self, request, product_name: str):
        product_list = Product.objects.filter(name=product_name)
        serializer = ProductSerializer(product_list, many=True)
        return Response(serializer.data)

 

물품명을 받아서 동일한 이름을 가진 모든 제품을 보여줘야하기 때문에 serializer에서 many=True를 추가해준다.


결과

같은 참외지만 판매처가 다른 제품 두개 모두 보여주는 결과값을 받았다.