[Django] Model + CRUD

Seaniiio·2024년 4월 4일
0

Django

목록 보기
2/5

todo list 대한 모델과 CRUD를 구현할 것이다.

새로운 앱 만들기

$ django-admin startapp todoapp
  • todoapp이라는 앱을 만들자.
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    'main',
    'todoapp',
]
  • setting.py에 추가해주자.
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("todo/", include('todoapp.urls'))
]
  • url설정을 추가해주자. ('django_study/urls.py')
  • 위 코드에 의해 todoapp의 urls.py에 작성한 url들이django_study/urls.py에 포함된다.
from django.contrib import admin
from django.urls import path

from . import views

urlpatterns = [
]
  • todoapp/urls.py를 작성해주자.

Todo 모델 만들기

todoapp/models.py 에 Todo 모델을 만든다.

from django.db import models

class Todo(models.Model):
    # django에서 pk는 자동으로 만들어준다.
    content = models.CharField(max_length = 80)     # 할 일 내용 
    completed = models.BooleanField(default=False)  # 완료 여부
    priority = models.IntegerField(default=3)       # 우선순위
    created_at = models.DateField(auto_now_add=True)# 생성 날짜
    deadline = models.DateField(null=True)          # 마감 기한
  • Todo 모델은 할 일 내용, 완료 여부, 우선순위, 생성 날짜, 마감 기한 필드를 가진다.

마이그레이션

마이그레이션 시스템을 사용하면 개발자가 모델(models.py 파일 내에 정의된)의 변경사항을 데이터베이스 스키마에 쉽게 적용할 수 있게 해주며, 이 변경사항을 '마이그레이션 파일'이라는 코드 형태로 기록한다.
이로 인해 데이터베이스 스키마의 변경사항을 소스 코드와 함께 버전 관리 시스템(예: git)을 통해 추적하고, 다른 개발 환경 또는 서버 환경에 쉽게 적용할 수 있게 됩니다.

  • 현재 models.py에 Todo라는 모델을 만들어주었기 때문에, 이 변경사항을 데이터베이스에 적용해주어야 한다.
    -> makemigrations
$ python manage.py makemigrations todoapp

  • 위의 명령어를 통해 스키마 변경사항을 기록하였다.
python manage.py migrate

  • 위의 명령어를 통해 쌓아둔 변경사항들을 데이터베이스에 적용하였다.

admin.py에 모델 추가

장고의 admin 페이지는 데이터를 관리할 수 있는 내장 웹 인터페이스이다.
장고 프로젝트의 모델에 저장된 데이터를 쉽게 조회, 생성, 수정, 삭제할 수 있게 해주며, 개발자가 추가적인 관리 인터페이스를 빠르게 구축할 수 있도록 돕습니다.

  • admin 페이지에서 위에서 만든 Todo 모델을 관리하기 위해 todoapp/admin.py를 다음과 같이 수정해준다.
from django.contrib import admin

from .models import Todo

# Register your models here.
admin.site.register(Todo)
  • 다음의 명령어를 통해 admin 계정을 생성할 수 있다.
$ python manage.py createsuperuser
  • 서버를 실행하고 localhost:8000/admin에 접속하면 아래와 같은 화면을 확인할 수 있다.

  • admin 페이지에 Todo 모델이 올라간 것을 확인할 수 있다.

CRUD

CRUD APICreate, Read, Update, Delete의 네 가지 기본적인 데이터 조작 작업을 수행하는 API를 말한다. 대부분의 웹 애플리케이션에서 기본적인 데이터 관리를 위해 필요하다.

CREATE

할 일을 생성해보자.

  1. create에 대한 url을 정의한다. (todoapp/urls.py)
from django.contrib import admin
from django.urls import path

from . import views

urlpatterns = [
    path('create/',views.create_todo)
]
  1. create 메서드를 정의한다. (todoapp/views.py)
import json
from django.http import JsonResponse
from .models import Todo

def create_todo(request):
    if request.method == 'POST':
        data = json.loads(request.body)

		# 필드에 대한 값 추출
        content = data.get('content')
        completed = data.get('completed')
        priority = data.get('priority')
        created_at = data.get('created_at')
        deadline = data.get('deadline')
		
        # 추출한 값을 기반으로 Todo 객체 생성하고 저장
        todo = Todo(
            content = content,
            completed = completed,
            priority = priority,
            created_at = created_at,
            deadline = deadline
        )

        todo.save()
        return JsonResponse({'message' : 'success'})
    return JsonResponse({'message' : 'POST 요청만 허용됩니다.'})
  1. Postman을 통해 POST요청을 직접 보내보자.
http://127.0.0.1:8000/todo/create/

  1. admin 페이지에서 생성된 Todo를 확인해보자.
  • 보낸 요청에 대한 Todo가 제대로 생성되었음을 확인할 수 있다.

READ - 전체 조회

전체 할 일 목록을 조회해보자.
1. url을 정의한다.(todoapp/urls.py)

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

from . import views

urlpatterns = [
    path('create/',views.create_todo),
    path('todos/', views.get_all_todos),
]
  1. 메서드를 정의한다.(todoapp/views.py)
def get_all_todos(request):
    if request.method == 'GET':
        todos = Todo.objects.all()
        
        todos_data = [{
            'id': todo.pk,
            'content': todo.content,
            'completed': todo.completed,
            'priority': todo.priority,
            'created_at': todo.created_at,
            'deadline': todo.deadline,
        } for todo in todos]

        return JsonResponse({'posts': todos_data, 'message': '조회 성공'}, status=200)
    return JsonResponse({'message':'GET 요청만 허용됩니다.'})
  1. Postman을 통해 요청을 직접 보내보자.

READ - 특정 todo 조회

id를 통해 특정 할 일을 조회해보자.

  1. url을 정의한다.(todoapp/urls.py)
from django.contrib import admin
from django.urls import path

from . import views

urlpatterns = [
    path('create/',views.create_todo),
    path('todos/', views.get_all_todos),
    path('<int:id>/',views.get_todo),
]

url에 id를 사용했다면, get_todo 메서드에서도 id를 사용해야 한다.(안 그러면 오류남)

  1. 메서드를 정의한다.(todoapp/views.py)
def get_todo(request, id):
    if request.method == 'GET':
        todo = get_object_or_404(Todo, id=id)

        data = {
            'id': todo.id,
            '내용': todo.content,
            '완료 여부': todo.completed,
            '우선순위': todo.priority,
            '생성 날짜': todo.created_at,
            '데드라인': todo.deadline,
            '메시지' : '조회 성공',
        }

        return JsonResponse(data, status=200)
    return JsonResponse({'message':'GET 요청만 허용됩니다.'})
  1. Postman을 통해 요청을 직접 보내보자.

UPDATE

  1. url을 정의한다.(todoapp/urls.py)
from django.contrib import admin
from django.urls import path

from . import views

urlpatterns = [
    path('create/',views.create_todo),
    path('todos/', views.get_all_todos),
    path('<int:id>/',views.get_todo),
    path('update_content/<int:id>/',views.update_todo_content)
]
  1. 메서드를 정의한다.(todoapp/views.py)
def update_todo_content(request, id):
    if request.method == 'PUT':
        data = json.loads(request.body)
        content = data.get('content')
        todo = get_object_or_404(Todo, id=id)
        todo.content = content
        todo.save()

        response_data = {
            "message": f"id: {id} 할 일의 내용이 업데이트되었습니다.",
            "content": content
        }

        return JsonResponse(response_data, status=200)
    return JsonResponse({'message': 'PUT 요청만 허용됩니다.'})
  1. Postman을 통해 요청을 직접 보내보자.

  2. admin 페이지에서 확인해보자.

  • content가 "장고 CRUD 복습하기"에서 "장고 과제하기"로 update된 것을 확인할 수 있다.

DELETE

  1. url을 정의한다.(todoapp/urls.py)
from django.contrib import admin
from django.urls import path

from . import views

urlpatterns = [
    path('create/',views.create_todo),
    path('todos/', views.get_all_todos),
    path('<int:id>/',views.get_todo),
    path('update_content/<int:id>/',views.update_todo_content)
    path('delete/<int:id>',views.delete_todo)
]
  1. 메서드를 정의한다.(todoapp/views.py)
def delete_todo(request, id):
    if request.method == 'DELETE':
        todo = get_object_or_404(Todo, id=id)
        todo.delete()
        data = {
            "message" : f"id: {id} 할 일 삭제 완료"
        }
        return JsonResponse(data, status=200)
    return JsonResponse({'message':'DELETE 요청만 허용됩니다.'})
  1. Postman을 통해 요청을 직접 보내보자.

  2. admin 페이지에서 확인해보자.

  • 생성했던 Todo가 삭제된 것을 확인할 수 있다.

0개의 댓글