HANCO

[#01] 게시판 CRUD 만들기 본문

웹개발/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

'웹개발 > python django' 카테고리의 다른 글

[#03] Python 가상환경 Django설치  (0) 2020.10.07
[#02] VSCode에서 python 가상환경  (0) 2020.10.07