ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django Rest Framework 2.실습-Serializer,ViewSets
    [Python,Django] 2020. 3. 16. 20:30

    본격적으로 Django Rest Framework를 통해 API서버를 만들어보쟈!

    먼저 DRF로 만든 API 서버는 Django의 웹어플리케이션과 다르게 문자열로된(serialized된) JSON을 클라이언트와 주고 받는다고 알고 있다. 클라이언트에서 데이터를 처리해주라는 POST요청을 서버에 할 때도 Django는 데이터를 form으로 입력받아 html로 넘기고 DRF는 데이터를 JSON으로 문자화(직렬화,Serialize)해서 전달하는 것이다.

    그렇다면  '데이터 직렬화'가 DRF의 가장 큰 역할이라 여겨지는데,,

    그래서 serializer를 작성하고 임포트해서 쓸 것이다!

     

    form대신 serializer/model은 상속받아서/router를 사용하는 url

    1.JSON의 직렬화 Serializer

    DRF serilaizer는 Django의 form과 매우 유사하다.

    Django에 두 가지 종류의 form(그냥form과 model form)이 있듯이 DRF도 그냥 serializer와 model serializer가 있다.

    그런데 실습으로는 model serializer만 한다.왜냐면 serializer는 데이터를 일일이 JSON으로 바꾸는 역할이라 복잡하니깐!

    아래는 Django의 form과 DRF의 Serializer를 비교한 것이다.

    form이라는 점,serializer라는점과 형식이 다른 뿐 그 역할을 갖다

    둘을 비교하는 이유는 순전히 빠른 이해를 위해서일뿐이다!

    참고로 model serialize는 쿼리셋이나 모델직렬화도 알아서 해주는 반면 일일이 다 직렬화를 해줘야한다.

     

    2.진짜 실습

    Django로 만드는 것과 같은 순서를 따른다 다만 django_rest_frame워크를 install해서 등록하는 것!

    나는 anaconda를 사용하므로 가상환경을 활성화 시킨 상태에서

    $pip install djangorestframework
    $pip instsall django

    2.
    $django-admin startproject --
    $cd --
    3.
    $python manage.py startapp --
    settings.py의 installed_apps 'rest_framework',앱 등록
    4.
    url등록(app폴더에 urls.py만들고 프로젝트폴더의 urls에 include하는 방식으로)
    5.
    모델 만들고 makemigrations migrate

    위는 대충 drf를 사용한 api서버를 만드는 방법을 순서대로 정리해본 것이다. 7번 views.py와 urls.py를 작성하는 방법을 상세하게 알아보자.

     

    앗 그전에 serializer.py작성하는 방법 먼저 알아보기

    Django에서는 입력받을때 app폴더 안에 form.py를 만들고 modelform을 상속받아 만들었다면

    DRF에서는 app폴더 내에 JSON을 직렬화시킬수 있는 코드를 담은 serializer.py를 작성(modelserializer상속)한다.

    #serializer.py 예시
    from .models import Post
    from rest_framework import serializers

    class PostSerializer(serializers.ModelSerializer):
        class Meta:
            model = Post #어떤 모델을 기반으로 serializer시킨건지
            #fields = '__all__' #1)모델의 모든 fields를 serizer시킬건지
            fields = ('id','title','body') #2)모델의 fields중 title과 body를 입력받을건지 리스트나 튜플로 작성가능
            #read_only_fields = ('title',) #못바꾸게 하고 싶다면
            #write_only_fields도 가능 

     

    #views.py 예시
    from django.shortcuts import render
    from rest_framework import viewsets
    from .models import Post
    from .serializer import PostSerializer

    #CBV

    class PostViewSet(viewsets.ModelViewSet):
        queryset=Post.objects.all()#Post모델의 모든 객체 끌어다가 쓴다
        serializer_class=PostSerializer

    views.py에는 모델클래스와 Serilizer클래스,rest_framework로부터 viewsets을 추가로 임포트해야한다.

    그리고 CBV로 로직 작성! 

    viewsets의 ModelViewSet을 상속한다.그리고 쿼리셋을 불러오고 serializer클래스를 지정하면 끝!

    이 viewsets을 상속하는 클래스 정의 하나만으로 API상에서 CRUD를 모두 가능케한다!

     

    urls.py또한 변화가 있으므로 상세히 보자.

    #app폴더>urls.py 예시
    from django.urls import path,include
    from rest_framework.routers import DefaultRouter 
    from . import views 

    #django rest framework는 라우터라는 개념을 통해 url을 결정한다
    router=DefaultRouter()
    router.register('post',views.PostViewSet)

    urlpatterns = [   
       path('',include(router.urls)),
    ]

    urls.py에는 view외에도 추가로 urls의 include와 rest_framework.routers 의 DefaultRouter를 임포트했다.

    라우터를 정의하고 view를 라우터에 등록한 후에 
    url리스트에 라우터를 path로 include하면 끝!

     

    이상태에서 runserver해서 보여지는 페이지:API root,API서버의 가장 밑단이 되는 주소,DefaultRouter의 디폴트 기본 루트 뷰이다.

    다음 시간엔 viewsets이 뭔지,router가 뭔지 자세히 봐야ㅔㅆ당 

     

     

    serializer에 대해 좋은 예제와 공식문서를 번역해둔 좋은 사이트!

    velog.io/@jcinsh/DRF-14-DRF-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C-%EC%9A%94%EC%95%BD

     

    DRF 14 - DRF 공식문서 요약

    참조관계를 갖는 다른 모델의 데이터를 사용해야 할 경우, 아래와 같이 참조할 모델의 Serializer를 가져와서 사용할 수 있다. 만약, nested representation이 반드시 필요한 경우가 아니라면, required=False

    velog.io

     

    '[Python,Django]' 카테고리의 다른 글

    Python 파이썬 기초 문법2 for 알고리즘  (0) 2020.05.11
    Django Rest Framework 3. view of DRF  (0) 2020.03.17
    Django Rest Framework 1.이론2  (0) 2020.03.14
    Generic View  (0) 2020.03.13
    Django Rest Framework 0.이론1  (0) 2020.03.13
Designed by Tistory.