DRF of Django Framework Based on mixins Encapsulated View Explanation
- 2021-07-26 08:02:12
- OfStack
Basic view
Example environment construction: Create a new Django project, connect Mysql database, configure routing and view functions, serialize and create py files separately
# Configure routing
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^PublishView/', views.PublishView.as_view()),
url(r'^PublishDetailView/(?P<pk>\d+)', views.PublishDetailView.as_view()),
]
# Views:
from django.shortcuts import render
from rest_framework.views import APIView
from app01 import models
from app01.MySer import BookSer,PublishSer,AuthorSer
from rest_framework.response import Response
# Create your views here.
# Basic view
class PublishView(APIView):
def get(self,request):
publish_list = models.Publish.objects.all()
bs = PublishSer(publish_list, many=True)
return Response(bs.data)
def post(self, request):
bs = PublishSer(data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors)
class PublishDetailView(APIView):
def get(self, request, pk):
publish_obj = models.Publish.objects.filter(pk=pk).first()
bs = PublishSer(publish_obj, many=False)
return Response(bs.data)
def put(self, request, pk):
publish_obj = models.Publish.objects.filter(pk=pk).first()
bs = PublishSer(data=request.data, instance=publish_obj)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.data)
def delete(self, request, pk):
models.Publish.objects.filter(pk=pk).delete()
return Response("")
# MySer.py
from rest_framework import serializers
from app01 import models
class BookSer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
class PublishSer(serializers.ModelSerializer):
class Meta:
model = models.Publish
fields = '__all__'
class AuthorSer(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = '__all__'
Views encapsulated based on mixins
Other things remain unchanged, change the view:
# Based on mixins To encapsulate the view
from rest_framework.mixins import CreateModelMixin,\
ListModelMixin,\
RetrieveModelMixin,\
DestroyModelMixin,\
UpdateModelMixin
from rest_framework.generics import GenericAPIView
class PublishView(CreateModelMixin, ListModelMixin, GenericAPIView):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class PublishDetailView(RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin, GenericAPIView):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
You can see that there is still a lot of redundant code in the view class
mixins package and re-package, method 3
# No. 1 3 Write in different ways:
from rest_framework.generics import CreateAPIView,\
ListCreateAPIView,\
DestroyAPIView,\
RetrieveUpdateDestroyAPIView
class PublishView(ListCreateAPIView):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
class PublishDetailView(RetrieveUpdateDestroyAPIView):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
There is still redundant code
The fourth way of writing, encapsulated again, is all written in one class
# Route
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^publish/$', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
url(r'^publish/(?P<pk>\d+)$', views.PublishView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
# No. 1 4 Write in different ways: 5 Interfaces are written in 1 In each class
from rest_framework.viewsets import ModelViewSet
class PublishView(ModelViewSet):
queryset = models.Publish.objects.all()
serializer_class = PublishSer
Additional:
from rest_framework.viewsets import ViewSetMixin
from rest_framework.views import APIView
# ViewSetMixin Rewritten as_view Method
class Test(ViewSetMixin,APIView):
def aaa(self,request):
return Response()