본문 바로가기
Python/Django Ⅱ

DRF 예제1 : Django REST Framework

by Mr.DonyStark 2024. 5. 18.

□ Django 와 DRF 차이점

특징 Pure Django Django Rest Framework
개발 목적 웹 풀스택 개발 백앤드 API 서버 개발
개발 결과 웹 페이지를 포함한 웹 서비스 여러 클라이언트에서 사용할 수 있는 API 서버
응답 형태 HTML JSON
다른 파일 templates Serializers.py

 

□ REST API 서버를  만들기 위한 라이브러리

백엔드 서비스를 위해 JSON과 같은 규격화된 데이터 제공

JSON과 같은 양식으로 다양한 플랫폼의 클라이언트에게 데이터를 제공해줄 수 있는 API 서버 프로젝트임

 

설치 및 실행

  ○ 설치(프로젝트 생성 및 app 생성 후)

pip install djangorestframework==3.13.1

 

 

  ○ 설치가 끝났다면 project > settings.py > INSTALLED_APPS에 추가해야함

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "rest_framework", #drf : rest framework
    "example" #생성된 app명
]

 

DRF Serializer

  ○ Django에서 기존 뷰에서 템플릿으로 데이터를 HTML로 제공해주었다면 DRF는 Serializer가 그 역할을 수행함

  ○ 시리얼라이저(serializer)

    - Django Models.py를 JSON 형태로 변환해주는 변환기

    - 사전적의미 직렬화

    - 직렬화는 Django 프로젝트에서 내가 만든 모델로부터 뽑은 queryset 즉, 모델 인스턴스를 JSON타입으로 바꿔줌

  ○ DRF 내에서 데이터를 저장할 때는 Django의 모델을 통해 저장함. 모델은 데이터베이스 테이블을 추상화한 개념이며 Django의 ORM을 통해 파이썬 문법으로 데이터를 처리해줌. 때문에 Django에서의 데이터는 파이썬 객체의 한 형태로 저장됨. 이런 데이터를 JSON 포맷으로 변환 및 보내주는 것이 Serializer 임.

  ○ 반대로 클라이언트가 데이터를 DRF서버에 보내주는 경우가 있는데, 즉, POST 요청을 보내는 API를 클라이언트가 사용해 데이터를 생성할 경우 클라이언트는 API 요청에 데이터를 JSON 등 문자열 형태로 입력해서 보내줘야함. 이때 JSON 등 문자열을 파이썬 데이터 객체로 변환하는 작업이 역직렬화, 즉, 디시리얼라이즈 Deserialize임.

 

  ○ Models.py 와 serializers.py

    - Models.py (*기존에 생성한 app의 model)

from django.db import models

#example app에 대한 모델 Book 클래스 생성
class Book(models.Model):
    bid = models.AutoField(primary_key=True) #book id
    title = models.CharField(max_length=50) #book 제목
    author = models.CharField(max_length=50) #book 작가
    category = models.CharField(max_length=50) #book 분류
    pages = models.IntegerField() #book 페이지수
    price = models.IntegerField() #book 가격
    published_date = models.DateField() #book 출판일
    description = models.TextField() #book 요약

 

    - serializers.py : serializers.Serializer 사용

from rest_framework import serializers
from .models import Book #example app의 모델에대한 값을 json 형태로 클라이언트에게 뿌려주려면 serialize 작업 필요

class BookSerializer(serializers.Serializer):
    #example app의 model에서 json으로 변환할 데이터 필드 선언
    bid = serializers.IntegerField(primary_key=True), #book id
    title = serializers.CharField(max_length=50), #book 제목
    author = serializers.CharField(max_length=50), #book 작가
    category = serializers.CharField(max_length=50), #book 분류
    pages = serializers.IntegerField(), #book 페이지수
    price = serializers.IntegerField(), #book 가격
    published_date = serializers.DateField(), #book 출판일
    description = serializers.TextField() #book 요약

    #post 방식으로 데이터 생성
    def create(self, validated_data):
        return Book.objects.create(**validated_data)
    #post 방식으로 데이터 수정
    def update(self, instance, validated_data):
        instance.bid = validated_data.get("bid", instance.bid)
        instance.title = validated_data.get("title", instance.title)
        instance.author = validated_data.get("author", instance.author)
        instance.category = validated_data.get("category", instance.category)
        instance.pages = validated_data.get("pages", instance.pages)
        instance.price = validated_data.get("price", instance.price)
        instance.published_date = validated_data.get("published_date", instance.published_date)
        instance.description = validated_data.get("description", instance.description)
        instance.save()
        return instance

 

    - serializers.py : serializers.ModelSerializer사용

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ["bid","title","author","category","pages","price","published_date","description"]

※코드 간편화와 효율을 위해 serializers.ModelSerializer 활용 권장