본문 바로가기
기타

[Django] 간단한 CRUD 만들기

by 고고 2021. 11. 4.

안녕하세요 ◠‿◠  고고입니다.

Post(id, content, imagePath)라는 객체를 CRUD(Crerate, Retreive, Update, Delete)할 수 있는 간단한 서버를 만들어보겠습니다.

 

사용 환경 : PyCharm

필요 사전 지식 : HTTP Method, HTTP Status Code

깃허브 소스 : https://github.com/Goeun1001/Django-Simple-CRUD

0. 최종 폴더 구조

1. django venv 설정

가상환경(virtualenv)를 설정합니다. 터미널의 앞에 (venv)가 있다면 가상환경에 있다는 뜻입니다.

$ python -m venv venv
$ source venv/bin/activate

venv/bin/activate 가 되지 않는 경우 $ source venv/Scripts/activate 를 시도해보세요.

 

2. django 설치하기

우선 pip를 최신 버전으로 업그레이드 해줍니다. 이때, pip란 파이썬의 패키지들을 관리하는 매니저입니다. (npm 등과 비슷함.)

그 후 django를 설치합니다.

$ (venv) python -m pip install --upgrade pip
$ (venv) pip install django
$ (venv) pip install djangorestframework

 

django는 requirements.txt로 패키지 의존성을 관리합니다. pip install된 것을 requirements.txt에 적어놓습니다.

$ (venv) pip freeze > requirements.txt

 

결과 : (사람마다 버전이 다를 수 있습니다.)

--- requirements.txt ---

Django==3.1.6
djangorestframework==3.12.4

 

 

requirements.txt에 있는 패키지를 전부 install하고싶다면

$ (venv) pip install -r requirements.txt

 

3. mysite 프로젝트 만들기

$ (venv) django-admin startproject mysite
$ (venv) cd mysite

 

Mysite라는 프로젝트가 만들어졌습니다.

 

django rest framework를 사용하기 위해서 mysite/settings.py의 INSTALLED_APPS에 ‘rest_framework’를 추가합니다.

  • migrate 및 runserver하기
$ mysite (venv) python manage.py migrate
$ mysite (venv) python manage.py runserver

 

migrate 시 이 문구들과 함께 폴더 안에 db.sqlite3가 생성됩니다.

 

runserver 시 이런 문구가 뜨며 1270.0.0.1:8000에서 django 서버를 볼 수 있습니다.

127.0.0.1:8000 실행화면 : 

  • admin 만들기

1270.0.1:8000/admin에서 이런 화면을 볼 수 있습니다. 터미널에서 admin 계정을 만들어야 로그인 할 수 있습니다.

$ mysite (venv) python manage.py createsuperuser

Username과 Password를 입력합니다.

이제 admin에서 로그인할 수 있습니다.

 

4. post 만들기

$ mysite (venv) python manage.py startapp post

 

post라는 앱이 추가되었습니다. 앱은 프로젝트와는 조금 다른 파일 구조를 가지고 있습니다.

프로젝트에 앱을 적용시키기 위해 mysite/setting.py의 INSTALLED_APPS에 post앱을 추가해줍니다.

 

  • Post 모델 만들기

post/models.py 를 이렇게 수정합니다.

from django.db import models


class Post(models.Model):
    id = models.AutoField
    title = models.CharField(max_length=20)
    content = models.CharField(max_length=100)
    imagePath = models.CharField(max_length=100)

    def __str__(self):
        return self.title

 

이것은 DB의 Post 테이블을 django ORM으로 만든 것입니다. 이것을 db.sqlite3에 적용시키기 위해서는 migration을 해야합니다.

 

$ mysite (venv) python manage.py makemigrations
$ mysite (venv) python manage.py migrate

 

0001_initial.py에 Post 모델이 적용된 사진.

 

post 폴더 안에 serializers.py를 만들고 수정합니다.

Serializer란 모델 인스턴스를 JSON 형태 혹은 Dictionary 형태로 직렬화 할 수 있게 도와주는 것입니다.

from rest_framework import serializers
from .models import Post


class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ['id', 'title', 'content', 'imagePath']

 

post/views.py를 이렇게 수정합니다.

 

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
    serializer_class = PostSerializer
    queryset = Post.objects.all()


post_list = PostViewSet.as_view({
    'get': 'list',
    'post': 'create',
})

post_detail = PostViewSet.as_view({
    'get': 'retrieve',
    'patch': 'partial_update',
    'delete': 'destroy',
})

 

views.py에서 django rest framework의 viewsets.ModelViewSet을 이용해서 CRUD를 쉽게 만들 수 있습니다.

 

  • post 앱에서 post/views.py의 view와 url을 연결시켜줍니다.
from django.urls import path
from . import views

urlpatterns = [
    path('post', views.post_list),
    path('post/<int:pk>', views.post_detail),
]

 

  • mysite 프로젝트에 post의 url을 추가해줍니다. mysite/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('post.urls')),
]

 

127.0.0.1:8000/에 들어가보면 post/urls.py가 적용된 것을 볼 수 있습니다.

 

127.0.0.1:8000/post에서 밑의 화면을 볼 수 있습니다.

django는 이렇게 화면을 제공합니다. 이제 여기서 새로운 post를 만들 수도 있고, 삭제할 수 있습니다.

 

  1. Create(POST)

POST를 한 후 성공하였다면 HTTP 201 Created 상태 코드를 받습니다.

 

2. Get – Detail

다시 Get – List를 하면 이런 화면을 볼 수 있습니다.

모든 포스트들이 아닌, id가 1인 포스트만을 보고싶으면 127.0.0.1:8000/post/<id: Int>로 이동해야 합니다.

127.0.0.1:8000/post/1 에 가니

DELETE, PATCH 버튼이 더 생겼습니다.

django rest framework의 viewsets로 빠르게 CRUD를 만들어보았습니다.

댓글