# 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'})),
]