웹개발/python django
[#01] 게시판 CRUD 만들기
HANCO
2020. 10. 3. 18:02
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