মডেল এবং সিরিয়ালাইজার আগের টিউটোরিয়াল থেকে কপি করো
APIView আমরা দুই ভাবে ব্যবহার করতে পারি
- ক্লাস ভিউ
- ফাংশন ভিউ
APIView ক্লাস ভিউ
APIView ক্লাস ভিউ আমরা দুই ভাবে ব্যবহার করতে পারি
একটি ক্লাসের মধ্যে ডেটাবেজ এ ডেটা ইন্সার্ট ,রিড ,আপডেট ডিলেট করার মেথড লিষ্টে পারি
মাল্টিপল পোস্ট ডেটাবেজ থেকে আনার জন্য many=True ব্যবহার করতে হবে
# myapp/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Post
from .serializers import PostSerializer
class PostView(APIView):
def get(self, request, pk=None):
if pk:
post = Post.objects.get(pk=pk)
serializer = PostSerializer(post)
return Response(serializer.data)
else:
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(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)
def put(self, request, pk):
post = Post.objects.get(pk=pk)
serializer = PostSerializer(post, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
post = Post.objects.get(pk=pk)
post.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
urls.py
# myapp/urls.py
from django.urls import path
from .views import PostView
urlpatterns = [
path('posts/', PostView.as_view(), name='post-list'),
path('posts/<int:pk>/', PostView.as_view(), name='post-detail'),
]
APIView ফাংশন ভিউ
APIView ফাংশন ভিউ আমরা দুই ভাবে ব্যবহার করতে পারি
১. একটি ফাংশন মধ্যে ডেটাবেজ এ ডেটা ইন্সার্ট ,রিড ,আপডেট ডিলেট করার মেথড লিষ্টে পারি
views.py
# myapp/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Post
from .serializers import PostSerializer
@api_view(['GET', 'POST'])
def post_list(request):
if request.method == 'GET':
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = PostSerializer(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_view(['GET', 'PUT', 'DELETE'])
def post_detail(request, pk):
try:
post = Post.objects.get(pk=pk)
except Post.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = PostSerializer(post)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = PostSerializer(post, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
post.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
urls.py
# myapp/urls.py
from django.urls import path
from .views import post_list, post_detail
urlpatterns = [
path('posts/', post_list, name='post-list'),
path('posts/<int:id>/', post_detail, name='post-detail'),
]
২. যদি আরো এক্সট্রা রাউট লাগে তখন কাস্টম আরেকটি ফাংশন বানিয়ে অতিরিক্তি ইউআরএল এর কোড লিখতে পারি
# myapp/views.py
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .models import Post
from .serializers import PostSerializer
@api_view(['GET'])
def single_post_view(request, pk):
try:
post = Post.objects.get(pk=pk)
serializer = PostSerializer(post)
return Response(serializer.data)
except Post.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
@api_view(['GET'])
def all_post_view(request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
# myapp/urls.py
from django.urls import path
from .views import single_post_view, all_post_view
urlpatterns = [
path('posts/<int:pk>/', single_post_view, name='single-post-view'),
path('posts/', all_post_view, name='all-post-view'),
]