Back-End/Django

[Django] 02. REST framework로 Django API 만들기 - serializer

uni2237 2021. 10. 5.
728x90
728x90

1탄 링크 : https://uni2237.tistory.com/84?category=830394 

 

[Django] 01. REST framework로 Django API 만들기

다른 게시물(아래 링크 참고)에서 Django 기본 프로젝트 만들기를 해보았으니, 이번 글에서 초기설정은 간단히 진행하겠습니다 (거의 비슷함!!) https://uni2237.tistory.com/71?category=830394 [Django] 01. Dja..

uni2237.tistory.com

 

 

지난 글에서 django 프로젝트를 생성하고, app도 만들었으니 이번엔 api 를 만들자!

 

 

0. model 생성

api를 만들기 전 다음 글을 참고하여 models.py에 원하는 db 테이블들을 추가한다. (링크)

완료했다면 시작!!

 


 

보통 REST API는 데이터를 JSON형식으로 주고 받는다.
그렇다면 원하는 db의 값들을 JSON형태로 가지고 있다면? api를 만드는 것이 수월할것이다.
이것을 도와주는 것이 바로 Serializer!!!

 

 

1. Serializer (직렬화)

Serializer는 Django Rest Framework에서 나온 새로운 요소이다.

queryset, 모델 인스턴스과 같은 복잡한 객체들을 JSON, XML 등과 같은 형태로 변환해준다!

 

-> 우리가 models.py에 만들어둔 모델들을 json 형태로 변환해줘 api에서 쉽게 사용할 수 있음 😉

 

# api/models.py
from django.db import models
from django.conf import settings
from django.utils import timezone


class Item_Info(models.Model):
    pid = models.CharField(max_length=200, null=False, primary_key=True)
    category_L = models.IntegerField()
    name = models.CharField(max_length=200)
    price = models.IntegerField()

    def __str__(self):
        return self.title

models.py에 저장되어있는 model이 위와 같다고 하자.

pid, category_L, name, price 총 4개의 컬럼을 가지고 있다.

 

 

1. api 폴더 아래에 serializers.py 파일을 생성한다.

2. 아래와 같이 serializer를 작성한다.

# api/serializers.py

from rest_framework import serializers
from .models import Item_Info, Item_Stock  # models.py에서 원하는 model import


class AllItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item_Info
        fields = ('pid', 'category_L', 'name', 'price')


class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item_Info
        fields = ('pid', 'name', 'price') # 변환 원하는 컬럼들

- rest_framework에서 serializer를 import 

- .models에서 json으로의 변환을 원하는 model들 Import

- json으로 변환하고 싶은 컬럼들만 가져와 filelds 값으로 넣어주면 끝!

 

 

 

2. API 생성  - views.py에서 serializer 사용

# api/views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Item_Info
from .serializers import AllItemSerializer, ItemSerializer

@api_view(['GET'])
def obj_detect_api(request,id):
    item = Item_Info.objects.get(pid=id)
    serializer = ItemSerializer(item)
    return Response(serializer.data)
# Response: {'pid': 0, 'name': 'pepsi', 'price': '1500'}
# ItemSerializer가 원하는 field값이 'pid', 'name', 'price' 였으므로 이에 해당하는 값들이 json형태로 반환된다.

@api_view()를 통해 함수 기반 뷰를 만들었습니다.

view 함수내에서 serializer를 사용해서 원하는 db의 값들을 json 형태로 불러온것을 확인할 수 있습니다.

 

 

 

3. url 생성 

# api/urls.py
from django.conf.urls import url, include
from django.urls import path, include
from .views import obj_detect_api, add_item_api, payment_api
from django.views.generic import TemplateView

urlpatterns = [

    # 이미지 인식 버튼 - 결과 이미지 전송
    path("object_detect/", obj_detect_api, name="object_detect"),

    # 항목추가 버튼 - 대,소분류 선택 / 가격 전송
    path("add_item/", add_item_api, name="add_item_api"),

    # 결제하기 버튼 - 재고 테이블 갱신
    path("payment/", payment_api, name="payment"),

]



# mysite/urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url, include
from django.views.generic import TemplateView

urlpatterns = [
    path('', TemplateView.as_view(template_name='index.html'), name='index'),
    path('admin/', admin.site.urls),
    path("api/", include("api.urls")), 

]

마지막으로 urls.py에 view함수들을 path형식으로 url 연결을 해주면 끝!

 

이때, mysite/urls.py의 ulrpatterns에서

path("api/", include("api.urls")),  라고 설정해두었기 때문에 기본 url은 'localhost:8000/api'가 된다.

-> 'localhost:8000/api/object_detect/' 로 들어가야 함!

 

path("", include("api.urls")), 로 한다면  'localhost:8000' 가 기본 url! 

728x90
728x90

댓글