todo list 대한 모델과 CRUD를 구현할 것이다.
$ django-admin startapp todoapp
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
'main',
'todoapp',
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("todo/", include('todoapp.urls'))
]
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
]
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) # 마감 기한
마이그레이션 시스템을 사용하면 개발자가 모델(models.py 파일 내에 정의된)의 변경사항을 데이터베이스 스키마에 쉽게 적용할 수 있게 해주며, 이 변경사항을 '마이그레이션 파일'이라는 코드 형태로 기록한다.
이로 인해 데이터베이스 스키마의 변경사항을 소스 코드와 함께 버전 관리 시스템(예: git)을 통해 추적하고, 다른 개발 환경 또는 서버 환경에 쉽게 적용할 수 있게 됩니다.
makemigrations
$ python manage.py makemigrations todoapp
python manage.py migrate
장고의 admin 페이지는 데이터를 관리할 수 있는 내장 웹 인터페이스이다.
장고 프로젝트의 모델에 저장된 데이터를 쉽게 조회, 생성, 수정, 삭제할 수 있게 해주며, 개발자가 추가적인 관리 인터페이스를 빠르게 구축할 수 있도록 돕습니다.
todoapp/admin.py
를 다음과 같이 수정해준다.from django.contrib import admin
from .models import Todo
# Register your models here.
admin.site.register(Todo)
$ python manage.py createsuperuser
서버를 실행하고 localhost:8000/admin에 접속하면 아래와 같은 화면을 확인할 수 있다.
admin 페이지에 Todo 모델이 올라간 것을 확인할 수 있다.
CRUD API는 Create, Read, Update, Delete의 네 가지 기본적인 데이터 조작 작업을 수행하는 API를 말한다. 대부분의 웹 애플리케이션에서 기본적인 데이터 관리를 위해 필요하다.
할 일을 생성해보자.
todoapp/urls.py
)from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('create/',views.create_todo)
]
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 요청만 허용됩니다.'})
http://127.0.0.1:8000/todo/create/
전체 할 일 목록을 조회해보자.
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),
]
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 요청만 허용됩니다.'})
id를 통해 특정 할 일을 조회해보자.
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를 사용해야 한다.(안 그러면 오류남)
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 요청만 허용됩니다.'})
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)
]
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 요청만 허용됩니다.'})
Postman을 통해 요청을 직접 보내보자.
admin 페이지에서 확인해보자.
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)
]
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 요청만 허용됩니다.'})
Postman을 통해 요청을 직접 보내보자.
admin 페이지에서 확인해보자.