Django

[django/drf]Djang Rest Framwork 공식문서 튜토리얼1(Serialization)

a-몬드 2022. 7. 11. 16:54
반응형

1. 가상 환경 세팅

python -m venv  drftest

drftest 폴더 > Script > activate

cd drftest
cd Script
activate # 가상환경 실행

가상환경 들어옴

2. django와 django rest framework 설치 

pip install django
pip install djangorestframework
pip install pygments # code 하이라이트를 위해서 사용할것

 

나는 가상환경과  project 보관하는 곳이 달라 프로젝트 저장하는 폴더로 따로 이동한 후

tutorial이라는 프로젝트를 만듦

cd ..
cd training
django-admin startproject tutorial # 튜토리얼 프로젝트 만들기
cd tutorial # 튜토리얼 프로젝트 폴더 들어가기

튜토리얼 폴더를 보면 manage.py가 만들어 진것 확인

3. snippets app 만들기

python manage.py startapp snippets

 

IDE로 만든 project을 열어준다. 나는 pycharm을 사용

4. tutorial/setting.py의 installed_apps에 추가

IDE로 만든 project을 열어준다. 나는 pycharm을 사용

6. model 만들기

 

# snippets/models.py
from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()])


class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ['created']

 

만든 모델 migration 해주기

python manage.py makemigrations snippets
python manage.py migrate snippets

 

7. snippets/Serializers.py 만들기 

#snippets/serializers.py
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    def create(self, validated_data):
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance

💚snippet으로 생성되는지 테스트해보기(솔직히 안 해봐도 될 듯,,)

python manage.py shell # shell로 text하기 위해

# snippet 2개 정도 생성 - start

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code='print("hello, world")\n')
snippet.save()

# snippet 2개 정도 생성 - end

# test해서 직접 보기
serializer = SnippetSerializer(snippet)
serializer.data

Json으로 보는 법

content = JSONRenderer().render(serializer.data)
content

 

8. Modelserializer 사용하기

django가 Form클래스와 ModelForm 클래스를 모두 제공하는 것처럼 

RESTframework도  Serializer클래스와 ModelSerializer를 모두 포함되어 있다.

ModelSerializer 클래스를 사용해서 serializer를 리팩토링 해보기

 

snippets/serializers.py를 다시 열고 SnippetSerializer클래스를 아래와 같이 변경

class SnippetSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snippet
        fields = ['id', 'title', 'code', 'linenos', 'language', 'style']

💚확인해보기

from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))

 

9. serializer 사용해서 django views.py작성

snippet의 목록 조회, 추가, 변경, 삭제 

from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer

@csrf_exempt
def snippet_list(request):
    if request.method == 'GET': # snippet 조회 메소드
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST': # snippet 추가 메소드 
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)
    
@csrf_exempt
def snippet_detail(request, pk):
    # 현재 존재하는 snippet인지 확인
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)
    # GET 메소드로 요청시 요청 snippet 데이터 보내줌 
    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return JsonResponse(serializer.data)
    # PUT 메소드로 요청 시 해당 pk snippet을 data로 변경
    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)
    # DELETE 메소드로 요청시 해당 pk snippet 삭제
    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)

 

10. urls.py로 view 연결하기

snippets 폴더에 urls.py 생성

# snippets/urls.py
from django.urls import path
from snippets import views

urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>/', views.snippet_detail),
]

snippet앱의 urls를 연결하기 위해 tutorial/urls.py에 추가

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('snippets.urls')),# 이부분 추가
]

 

💚테스트해보기

quit() #shell로 테스트하던 사람들 shell종료하기
python manage.py runserver # 개발서버 시작하기

브라우저에 http://127.0.0.1:8000/ 치고 들어가 본다.

당연하다 우리가 들어가자마자 뭔가 볼 수 있게 안 해놓음;

 

브라우저에 아래 주소를 입력

http://127.0.0.1:8000/snippets/

Json으로 snippet 목록 데이터가 보인다. 

http://127.0.0.1:8000/snippets/2/

는 id가 2번인 데이터가 보인다.

이번 튜토리얼은 성공적으로 마무리된 것이다. 

현재는 response 하는 것 말고는 특별한 작업을 하지 않는다. 

 

참조

https://www.django-rest-framework.org/tutorial/1-serialization/

반응형