꼬물꼬물

장고 학습 1 본문

코딩/장고

장고 학습 1

멩주 2022. 3. 8. 03:49

참고 강의: 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 프로젝트명 경로(.는 현재 경로)

tutorial 하위에 기본적인 파일이 생성되었다.

# 8. 앱 생성
# 앱 이름은 일반적으로 복수형을 권장한다.
# 앱은 기능 단위로 생성한다.
# snippets라는 application 추가
python manage.py startapp 앱이름

앱 생성 완료
tutorial에 settings.py에 마지막 두줄 직접 추가
코드 추가

참고한 링크: https://www.django-rest-framework.org/tutorial/1-serialization/#tutorial-1-serialization

모델

작업할 모델 만들기

장고에서 모델은 데이터를 저장하고 불러오는 데이터베이스의 모든 관문.

장고의 모델은 ORM이라는 기술을 사용한다.

객체와 관계형 데이터베이스의 데이터를 매핑해준다.

sql문 쿼리 없이 다룰 수 있도록 한다. 효율적, 유지보수, 가독성에 좋다.

snippets/models.py 추가

# 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 형식으로 필요한 정보를 되돌려 준다.

serializer 클래스 생성

# 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

ORM에 직접 접속하기
데이터 생성
마지막에 생성한 데이터 확인
many=True로 직렬화해 데이터 전체보기
JSON으로 변환해 확인

ModelSerializers를 사용하면 Serializer코드가 Simple해진다.

serializers.py 변경

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

나갔다가 다시 들어오기
다시 import 하고 부르면 같은 결과가 나온다.

Views 작성 

list와 detail view 함수 작성

# 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 추가

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),
]

main에서 접근 가능하도록 tutorial/urls.py에도 추가

서버 실행

서버 실행 runserver
다른 터미널 창에서 서버 테스트 하기위해 httpie 설치
url을 통해 모든 데이터를 api로 불러올 수 있다. (view의 list)
view의 detail로 1번만 불러오겠다는 url

'코딩 > 장고' 카테고리의 다른 글

장고 학습 2  (0) 2022.03.09