HANCO
[#01] 게시판 CRUD 만들기 본문
django로 게시판 CRUD 만들기 실습을 해보았습니다.
GET, POST, PUT, DELETE 요청에 따라서 다른 동작을 하는 API입니다.
models.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.urls import reverse
# user model 사용
from django.contrib.auth import get_user_model
from taggit.managers import TaggableManager
# Create your models here.
# 게시판
class Board(models.Model):
objects = models.Manager()
title = models.CharField('title', max_length=200)
text = models.TextField('text', max_length=4096)
owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, verbose_name='OWNER', blank=True, null=True)
tags = TaggableManager(blank=True)
created_at = models.DateTimeField('CREATED DATE', auto_now=False, auto_now_add=True)
modified_at = models.DateTimeField('MODIFIED DATE', auto_now=True)
def __str__(self):
return self.title
view.py
# 게시판 리스트 API
class BoardListAPIView(APIView):
def get(self, request):
qs = Board.objects.all()
serializer = BoardSerializer(qs, many=True)
return Response(serializer.data)
def post(self, request):
serializer = BoardSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 게시판 디테일 API
class BoardDetailAPIView(APIView):
def get_object(self, pk):
qs = get_object_or_404(Board, pk=pk)
return qs
# 글 디테일
def get(self, request, pk):
qs = self.get_object(pk)
serializer = BoardSerializer(qs)
return Response(serializer.data)
# 글 수정
def put(self, request, pk):
qs = self.get_object(pk)
serializer = BoardSerializer(qs, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
# 글 삭제
def delete(self, request, pk):
qs = self.get_object(pk)
qs.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
serializers.py
# Board
class BoardSerializer(serializers.ModelSerializer):
class Meta:
model = Board
fields = "__all__"
urls.py
from django.urls import path, include
from rest_framework import routers
from .views import (
TestAPI,
BoardListAPIView,
BoardDetailAPIView,
)
app_name = 'api'
urlpatterns = [
path('test/', TestAPI),
# ### Users
# path('auth/user/', UserAPI.as_view()),
# #login
# path("auth/login/", LoginAPI.as_view()),
# #signup
# path("auth/register/", RegistrationAPI.as_view()),
# #profile
# path("auth/profile/<int:user_pk>/update/", ProfileUpdateAPI.as_view()),
### Board
path('board/list/', BoardListAPIView.as_view(), name='board-list'),
path('board/<int:pk>/', BoardDetailAPIView.as_view(), name='board-detail')
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from .models import Board
@admin.register(Board)
class BoardAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'modified_at', 'tag_list')
# prefetch_related : database에서 쿼리 호출 수를 줄이기위해
# 보드 레코드를 가져올때 태그레코드도 같이 가져온다
# 1:N = select_related
# N:N = prefetch_related
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related('tags')
def tag_list(self, obj):
return u", ".join(o.name for o in obj.tags.all())
참고
Alex님 감사합니다.
https://velog.io/@ifyouseeksoomi
'웹개발 > python django' 카테고리의 다른 글
[#03] Python 가상환경 Django설치 (0) | 2020.10.07 |
---|---|
[#02] VSCode에서 python 가상환경 (0) | 2020.10.07 |