APIView GenericAPIView ListModelMixin GenericViewSet ModelViewSet 小受气包lzw

# view.py

from django.shortcuts import render

from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework.generics import GenericAPIView, ListAPIView, RetrieveAPIView, \
    CreateAPIView, UpdateAPIView, DestroyAPIView

from rest_framework.mixins import ListModelMixin, UpdateModelMixin, RetrieveModelMixin, CreateModelMixin, \
    DestroyModelMixin
from . import models
from . import serializer

'''
各视图 继承关系
APIView

GenericAPIView:继承 APIView 
多了操作数据库与序列化类的属性 -- 可以快速写接口 
get_queryset   返回全部表模型
get_object     返回想要的单表模型
get_serializer 返回序列化器
serializer_class 多个序列化器共用一个视图时使用 默认返回 serializer_class

ListAPIView ---ListModelMixin GenericAPIView

ListModelMixin:
# 源码     
def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
# 自己的
    def get(self, request):
        book = models.Book.objects.all()
        book_serializer = serializer.BookSerializers(book, many=True)
        return Response(book_serializer.data)
        
GenericViewSet --- ViewSetMixin, GenericAPIView
ViewSetMixin -- as_view重写了


ModelViewSet ----   CreateModelMixin,
                    RetrieveModelMixin,
                    UpdateModelMixin,
                    DestroyModelMixin,
                    ListModelMixin,
                    GenericViewSet
'''


# 1 APIView
class Book1APIView(APIView):
    # 单查
    def get(self, request, pk):
        book = models.Book.objects.filter(pk=pk).first()
        book_serializer = serializer.BookSerializers(book)
        return Response(book_serializer.data)

    # 改
    def put(self, request, pk):
        book = models.Book.objects.filter(pk=pk).first()
        book_serializer = serializer.BookSerializers(instance=book, data=request.data)
        if book_serializer.is_valid():
            book_serializer.save()
            return Response(data={'code': 100, 'data': book_serializer.data})
        else:
            return Response(data={'code': 0, 'data': book_serializer.errors})

    def delete(self, request, pk):
        models.Book.objects.filter(pk=pk).delete()
        return Response(data='成功')


class Book2APIView(APIView):
    # 群查
    def get(self, request):
        book = models.Book.objects.all()
        book_serializer = serializer.BookSerializers(book, many=True)
        return Response(book_serializer.data)

    # post
    def post(self, request):
        book_serializer = serializer.BookSerializers(data=request.data)
        if book_serializer.is_valid():
            book_serializer.save()
            return Response(data={'code': 100, 'data': book_serializer.data})
        else:
            return Response(data={'code': 0, 'data': book_serializer.errors})


# 2 GenericAPIView
class BooK3GenericAPIView(GenericAPIView):
    # 操作数据库
    queryset = models.Book.objects.all()
    # 操作序列化器
    serializer_class = serializer.BookModelSerializer

    # 单查
    def get(self, request, pk):
        book = self.get_object()
        book_serializer = self.get_serializer(book)
        return Response(book_serializer.data)

    # 改
    def put(self, request, pk):
        # get_object() 返回一个你需要的表模型
        book = self.get_object()
        # get_serializer -- 返回一个序列化器对象
        book_serializer = self.get_serializer(instance=book, data=request.data)
        if book_serializer.is_valid():
            book_serializer.save()
            return Response(data={'code': 100, 'data': book_serializer.data})
        else:
            return Response(data={'code': 0, 'data': book_serializer.errors})

    def delete(self, request, pk):
        self.get_object().delete()
        return Response(data='成功')


class BooK4GenericAPIView(GenericAPIView):
    # 改变 queryset serializer_class 可以快速改变想要的数据
    # 操作数据库
    queryset = models.Publish.objects.all()
    # 操作序列化器
    serializer_class = serializer.PublishModelSerializer

    # 群查
    def get(self, request):
        book = self.get_queryset()
        book_serializer = self.get_serializer(book, many=True)
        return Response(book_serializer.data)

    # post
    def post(self, request):
        book_serializer = self.get_serializer(data=request.data)
        if book_serializer.is_valid():
            book_serializer.save()
            return Response(data={'code': 100, 'data': book_serializer.data})
        else:
            return Response(data={'code': 0, 'data': book_serializer.errors})


# 3 五大视图
class Book5ListAPIView(ListAPIView, GenericAPIView):
    # 操作数据库
    queryset = models.Book.objects.all()
    # 操作序列化器
    serializer_class = serializer.BookModelSerializer


# 4. GenericAPIView + mixin(视图扩展)

class BooK7GenericMixin(GenericAPIView, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin):
    # 操作数据库
    queryset = models.Book.objects.all()
    # 操作序列化器
    serializer_class = serializer.BookModelSerializer

    def get(self, request, pk):
        return self.retrieve(request, pk)

    def put(self, request, pk):
        return self.update(request, pk)

    def delete(self, request, pk):
        return self.destroy(request, pk)


class BooK8GenericMixin(GenericAPIView, ListModelMixin, CreateModelMixin):
    # 操作数据库
    queryset = models.Book.objects.all()
    # 操作序列化器
    serializer_class = serializer.BookModelSerializer

    def get(self, request):
        return self.list(request)

    def post(self, request):
        return self.create(request)


from rest_framework.viewsets import ModelViewSet, GenericViewSet


# ModelViewSet

class BookModelViewSet(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookModelSerializer

# serializer.py

from rest_framework import serializers

from . import models


class BookSerializers(serializers.Serializer):
    id = serializers.CharField(read_only=True)
    title = serializers.CharField()
    price = serializers.CharField()
    author = serializers.CharField()
    add = serializers.CharField()

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title')
        instance.price = validated_data.get('price')
        instance.author = validated_data.get('author')
        instance.add = validated_data.get('add')
        instance.save()
        return instance

    def create(self, validated_data):
        instance = models.Book.objects.create(**validated_data)

        return instance


class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Publish
        fields = '__all__'

# urls.py

"""drf002 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    # API --- get(单) put delete
    re_path(r'books1/(?P<pk>\d+)', views.Book1APIView.as_view()),
    # API --- get(群) post
    path('books2/', views.Book2APIView.as_view()),

    # GenericAPIView --- get(单) put delete
    re_path(r'books3/(?P<pk>\d+)', views.BooK3GenericAPIView.as_view()),
    # GenericAPIView --- get(群) post
    path('books4/', views.BooK4GenericAPIView.as_view()),

    # 五大视图
    path('books5/', views.Book5ListAPIView.as_view()),

    # GenericAPIView + mixin(视图扩展) --- get(单) put delete
    re_path(r'books7/(?P<pk>\d+)', views.BooK7GenericMixin.as_view()),
    # GenericAPIView + mixin(视图扩展) --- get(群) post
    path('books8/', views.BooK8GenericMixin.as_view()),

    # BookModelViewSet + mixin(视图扩展) --- get(单) put delete
    re_path(r'books9/(?P<pk>\d+)',
            views.BookModelViewSet.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    # BookModelViewSet + mixin(视图扩展) --- get(群) post
    path('books10/', views.BookModelViewSet.as_view(actions={'get': 'list', 'post': 'create'})),

]
 

  

posted @ 2021-05-20 23:00  mofr  阅读(51)  评论(0)    收藏  举报