꼬물꼬물
장고 학습 1 본문
참고 강의: https://www.youtube.com/watch?v=VMiaw1bA9xk
ORM 사용 이유: DB를 객체로 조작하기 위해 ORM을 사용한다. ((생산성))
# 1. 파이썬 가상 환경 생성 (env라는 이름의 가상환경)
python -m venv env
# 2. 가상환경 활성화 (활성화 한 뒤 pip install을 진행해야 전역으로 설치되지 않는다.
# 장고 서버 켜기전에 항상 가상환경 활성화를 하자.
source env/Script/activate
# 3. 설치된 패키지 리스트 확인 방법
pip list
# 4. 장고 설치
pip install django
# 6. 장고 프레임워크 설치
pip install djangorestframework
# pygments는 코드의 가독성을 위해 추가
pip install pygments
# 7. 프로젝트 생성
django-admin startproject 프로젝트명 경로(.는 현재 경로)
# 8. 앱 생성
# 앱 이름은 일반적으로 복수형을 권장한다.
# 앱은 기능 단위로 생성한다.
# snippets라는 application 추가
python manage.py startapp 앱이름
참고한 링크: https://www.django-rest-framework.org/tutorial/1-serialization/#tutorial-1-serialization
모델
작업할 모델 만들기
장고에서 모델은 데이터를 저장하고 불러오는 데이터베이스의 모든 관문.
장고의 모델은 ORM이라는 기술을 사용한다.
객체와 관계형 데이터베이스의 데이터를 매핑해준다.
sql문 쿼리 없이 다룰 수 있도록 한다. 효율적, 유지보수, 가독성에 좋다.
# 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']
오류가 나는 이유는 migrations에 데이터를 추가해야 한다.
# migration 내용대로 테이블이 생성된다.
python manage.py makemigrations snippets
# 생성된 migration으로 실제 테이블 생성
python manage.py migrate
Serializer 클래스 만들기
프론트엔드에서 서버로 어떤 요청하면 시리얼라이저가 요청에 응해서 JSON 형식으로 필요한 정보를 되돌려 준다.
# 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):
"""
Create and return a new `Snippet` instance, given the validated data.
"""
return Snippet.objects.create(**validated_data)
def update(self, instance, validated_data):
"""
Update and return an existing `Snippet` instance, given the 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
ModelSerializers를 사용하면 Serializer코드가 Simple해진다.
# snippets/serializers.py
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ['id', 'title', 'code', 'linenos', 'language', 'style']
Views 작성
# snippets/views.py
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):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
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):
"""
Retrieve, update or delete a code snippet.
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return JsonResponse(serializer.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)
elif request.method == 'DELETE':
snippet.delete()
return HttpResponse(status=204)
URLS 추가
# 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),
]