drf view family

  View family

    

"" " 
Views: View 
generics: Tools view 
mixins: View toolset 
viewsets: View Set 
" "" 
"" " 
learning curve 
APIView => GenericAPIView => mixins five tools => generics tools in view => viewsets in view set 
"" "

GenericAPIView base class

GenericAPIView inherited APIView using fully compatible APIView 

Key: GenericAPIView done APIView on the basis of what things

     1 , get_queryset (): obtain a model from the class properties queryset in queryset data
     2 , get_object (): obtain a model from the class attribute queryset in queryset the data in the operation target is determined by the well-known single packet PK
     . 3, get_serializer (): class properties obtained from serializer sequence classes serializer_class
urlpatterns = [
    url(r'^v2/books/$', views.BookGenericAPIView.as_view()),
    url(r'^v2/books/(?P<pk>.*)/$', views.BookGenericAPIView.as_view()),
]
from rest_framework.generics import GenericAPIView
class BookGenericAPIView(GenericAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer
    # 自定义主键的 有名分组 名
    lookup_field = 'pk'
    # 群取
    # def get(self, request, *args, **kwargs):
    #     book_query = self.get_queryset()
    #     book_ser = self.get_serializer(book_query, many=True)
    #     book_data = book_ser.data
    #     return APIResponse(results=book_data)

    # 单取
    def get(self, request, *args, **kwargs):
        book_query = self.get_object()
        book_ser = self.get_serializer(book_query)
        book_data = book_ser.data
        return APIResponse(results=book_data)

mixins view toolset - assisted GenericAPIView

# 1) There are five tools mixins class files, provided a total of five tools, six utility methods: single check (retrieve), group check list, Tenzin create, delete single, single overall reform update, single partial change partial_update 
# 2) requests inheritance simplifies tools implemented body function, but must inherit GenericAPIView, several class attributes and methods (see above GenericAPIView knowledge base class) needs to provide GenericAPIView class 
# 3) tool or the like tools method return value response is the type of object, no avail to format the data format back to the front, can get response response data type of the object returned by the method of tools response.data
urlpatterns = [
       url(r'^v3/books/$', views.BookMixinGenericAPIView.as_view()),
    url(r'^v3/books/(?P<pk>.*)/$', views.BookMixinGenericAPIView.as_view()),
]
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
class BookMixinGenericAPIView(ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, GenericAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer

    def get(self, request, *args, **kwargs):
        if 'pk' in kwargs:
            response = self.retrieve(request, *args, **kwargs)
        else:
            #response object list is provided a method mixins Response, like the object formatted APIResponse 
            Response = self.list (Request, * args, ** kwargs)
         # Response response.data data are stored in the 
        return APIResponse (= Results response.data) 

    DEF POST (Self, Request, * args, ** kwargs): 
        Response = self.create (Request, * args, ** kwargs)
         return APIResponse (Results = response.data) 

    DEF PUT (Self, Request, args *, ** kwargs): 
        Response = self.update (Request, * args, ** kwargs)
         return APIResponse (Results = response.data) 

    DEF patch(self, request, *args, **kwargs):
        response = self.partial_update(request, *args, **kwargs)
        return APIResponse(results=response.data)

Tool Views

# 1) tool views are subclasses GenericAPIView, and the different sub-classes inherit different tools, rewrite the request method 
# 2) If the direct view function tool to meet the demand, only need to inherit tool view, provide queryset and can serializer_class
urlpatterns = [
       url(r'^v4/books/$', views.BookListCreatePIView.as_view()),
    url(r'^v4/books/(?P<pk>.*)/$', views.BookListCreatePIView.as_view()),
]
from rest_framework.generics import ListCreateAPIView, UpdateAPIView
class BookListCreatePIView(ListCreateAPIView, UpdateAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer

View Set

# 1) is set priority inheritance ViewSetMixin view class, then the class inherits a view (GenericAPIView or APIView) 
#        GenericViewSet, Viewset 
# when 2) ViewSetMixin provides as_view rewritable () method of the view class inheritance viewset, configure routing call as_view () must pass request name - the function name dictionary mapping relationship 
#        EG: URL (R & lt '^ V5 / Books / $', views.BookGenericViewSet.as_view ({ 'GET': 'my_get_list'})), 
#        represents get requests to view function processing my_get_list
the urlpatterns = [
        # View of as_view (): the get request is mapped to the get method of the view class 
    # Viewset of as_view ({ 'get': ' my_get_list'}): the get request is mapped to my_get_list method of the view class of the 
    URL (R & lt ' V5 ^ / Books / $ ' , views.BookGenericViewSet.as_view ({ ' GET ' : ' my_get_list ' })), 
    (R & lt URL ' ?. ^ V5 / Books / (P <PK> *) / $ ' , views. BookGenericViewSet.as_view ({ ' GET ' : ' my_get_obj ' })), 
]
from rest_framework.viewsets import GenericViewSet
from rest_framework import mixins
class BookGenericViewSet(mixins.RetrieveModelMixin, mixins.ListModelMixin, GenericViewSet):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer

    def my_get_list(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def my_get_obj(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

The difference between the two most inherited view of GenericAPIView and APIView

# . 1) and GenericViewSet Viewset inherit ViewSetMixin, as_view can configure request - the function mapping 
# 2) GenericViewSet GenericAPIView view class inheritance is used to complete the standard model-based user interface 
# . 3) Viewset inherited APIView view class, used to complete the model class need not participate in, or non-standard model-based user interface 
#        post request under standard model-based operation is to add an interface, does not satisfy the landing post 
#        post interface to request a verification code, does not require the model class participate 
# authentication information login post request, the new data is not complete, but the data submitted by post, the results obtained are not logged in user information, but landing: case

Tool set of views

urlpatterns = [
       url(r'^v6/books/$', views.BookModelViewSet.as_view({'get': 'list', 'post': 'create'})),
    url(r'^v6/books/(?P<pk>.*)/$', views.BookModelViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'})),
]
from rest_framework.viewsets Import ModelViewSet
 class BookModelViewSet (ModelViewSet): 
    QuerySet = models.Book.objects.filter (is_delete = False) 
    serializer_class = serializers.BookModelSerializer 

    # delete is not a database, but remove fields in the record 
    DEF the destroy (Self, Request , * args, ** kwargs): 
        instance = self.get_object ()   # of the type: models.Book 
        IF  not instance:
             return APIResponse (1, ' delete failed ' )   # actual operation, before it made a judgment 
        instance.is_delete =True 
        instance.save () 
        return APIResponse (0, ' deleted successfully ' )

Routing components

from django.conf.urls Import the include
 from rest_framework.routers Import SimpleRouter 
Router = SimpleRouter ()
 # all routes and ViewSet view class can be registered, will have '^ v6 / books / $' and '^ v6 / books / (? P <PK> [^ /.] +) / $ ' 
router.register ( ' V6 / Books ' , views.BookModelViewSet) 

the urlpatterns = [
     # a first mode to add a child list 
    URL (R & lt ' ^ ' , the include (Router. urls)), 
] 
# The second way to add a sub-list 
# urlpatterns.extend (router.urls)

 

Guess you like

Origin www.cnblogs.com/Fzhiyuan/p/11705904.html