😊

【Django】Pythonで作るRest API【16Delete Post】

2023/02/03に公開

【16Delete Post】

YouTube: https://youtu.be/beV7qrOWibA

https://youtu.be/beV7qrOWibA

今回は「Post」のデリートのビューを実装します。

まず、前回作成した「urls.py」ですが、

    path('<str:pk>/', getPostById, name='getPost'),
    path('create/', createPost, name='createPost'),

上の状態ですと
ブラウザに入力した際に「create」が「pk」として認識されて
エラー画面が表示されてしまうので、
上下を入れ替えます。

    path('create/', createPost, name='createPost'),
    path('<str:pk>/', getPostById, name='getPost'),
myapp/posts/views.py
from django.shortcuts import render
from django.http import HttpResponse
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response

# Create your views here.
def helloWorld(request):
  # return HttpResponse('Hello World')
  hello = 'hello'
  return render(request, 'posts/index.html', {})

@api_view(['GET'])
def getAllPosts(request):
  posts = Post.objects.all()
  serializer = PostSerializer(posts, many=True)

  return Response(serializer.data)

@api_view(['POST'])
def createPost(request):
  data = request.data
  user = request.user

  post = Post.objects.create(
    title = data['title'],
    content = data['content'],
    author = user
  )

  serializer = PostSerializer(post, many=False)
  return Response(serializer.data)

@api_view(['GET'])
def getPostById(request, pk):
  post = Post.objects.get(id=pk)

  serializer = PostSerializer(post, many=False)
  return Response(serializer.data)

@api_view(['DELETE'])
def deletePost(request, pk):
  post = Post.objects.get(id=pk)
  post.delete()

  return Response({'message': 'delete success'})

class PostViewSet(viewsets.ModelViewSet):
  queryset = Post.objects.all()
  serializer_class = PostSerializer
myapp/posts/url.py
from django.urls import path, include
from .views import helloWorld, PostViewSet, getAllPosts, createPost, getPostById, deletePost
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'posts', PostViewSet, basename='posts')

urlpatterns = [
    path('hello/', helloWorld, name='hello'),
    path('', getAllPosts, name='getAllPosts'),
    path('create/', createPost, name='createPost'),
    path('<str:pk>/', getPostById, name='getPost'),
    path('<str:pk>/delete/', deletePost, name='deletePost'),
    path('', include(router.urls))
]

パスの追加ができましたら、

http://localhost:8000/posts/6/delete/

こちらにアクセスしてデリートボタンをクリックします。

動画では「id」が「6」となっていますが、
こちらは存在する「Post」の「id」に置き換えてください。

Discussion