两个基本类
APIView
from rest_franmework.views import APIView
APIView与View的不同之处在于:
- 传入到视图方法中的是REST framework的
Request对象,而不是Django的HttpRequeset对象;- 视图方法可以返回REST framework的
Response对象,视图会为响应数据设置(render)符合前端要求的格式;- 任何
APIException异常都会被捕获到,并且处理成合适的响应信息;- 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
代码案例:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.generics import GenericAPIView from rest_framework.mixins import CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin from .models import BookInfo, HeroInfo from book.serializers import BookSerializer, HeroSerializer class BooksView(APIView): def get(self, request): """ 获取所有图书 :param request: :return: """ books = BookInfo.objects.all() # 序列化处理,返回操作 ser = BookSerializer(books, many=True) data = ser.data return Response(data) def post(self, request): """ 保存图书 :param request: :return: """ # 1. 获取前端数据 data = request.data # 2. 验证数据 ser = BookSerializer(data=data) ser.is_valid(raise_exception=True) print(ser.errors) # 3. 保存数据 ser.save() # 4. 返回结果 return Response(ser.data) class BookView(APIView): def get(self, request, pk): """ 获取单一图书 :param request: :param pk: 查询图书的id :return: """ # 1. 查询数据 --》 验证过程 try: book = BookInfo.objects.get(id=pk) except: return Response({'error': '错误的id'}, status=400) # 返回结果 ser = BookSerializer(book) return Response(ser.data) def put(self, request, pk): """ 更新单一图书 :param request: :param pk: :return: """ # 1. 获取前端数据 data = request.data # 2. 验证数据 book = BookInfo.objects.get(id=pk) ser = BookSerializer(book, data=data) # 3. 处理数据 --》 更新数据 ser.is_valid(raise_exception=True) ser.save() # 4. 返回结果 return Response(ser.data) def delete(self, request, pk): """ 删除单一图书 :param request: :param pk: :return: """ pass
GenericAPIView
from rest_framework.generics import GenericAPIViewclass BooksView(GenericAPIView): serializer_class = BookSerializer # 指定序列化器 queryset = BookInfo.objects.all() # 指定数据对象查询集支持定义的属性:
- 列表视图与详情视图通用:
- queryset 列表视图的查询集
- serializer_class 视图使用的序列化器
- 列表视图使用:
- pagination_class 分页控制类
- filter_backends 过滤控制后端
- 详情页视图使用:
- lookup_field 查询单一数据库对象时使用的条件字段,默认为'pk'
- lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同
提供的方法:
self.get_serializer(): 调用序列化器self.get_queryset(): 获取序列化器对象self.get_object(): 获取查询集中的单一对象self.get_serializer_class(): 获取序列化类代码案例:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.generics import GenericAPIView from rest_framework.mixins import CreateModelMixin, UpdateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin from .models import BookInfo, HeroInfo from book.serializers import BookSerializer, HeroSerializer class BooksView(GenericAPIView): serializer_class = BookSerializer # 指定序列化器 queryset = BookInfo.objects.all() # 指定数据对象查询集 def get(self, request): """ 获取所有图书 :param request: :return: """ # 查询 books = self.get_queryset() # 获取查询集所有数据 # 序列化操作 ser = self.get_serializer(books, many=True) return Response(ser.data) def post(self, request): """ 保存图书 :param request: :return: """ # 1. 获取前端数据 data = request.data # 2. 验证数据 ser = self.get_serializer(data=data) ser.is_valid(raise_exception=True) print(ser.errors) # 3. 保存数据 ser.save() # 4. 返回结果 return Response(ser.data) class BookView(GenericAPIView): serializer_class = BookSerializer # 指定序列化器 queryset = BookInfo.objects.all() # 指定数据对象查询集 def get(self, request, pk): """ 获取单一图书 :param request: :param pk: 查询图书的id :return: """ # 1. 查询数据 --》 验证过程 try: book = self.get_object() # 从查询集中,获取单一数据对象 except: return Response({'error': '错误的id'}, status=400) # 返回结果 ser = self.get_serializer(book) # 获取序列化器对象 return Response(ser.data) def put(self, request, pk): """ 更新单一图书 :param request: :param pk: :return: """ # 1. 获取前端数据 data = request.data # 2. 验证数据 book = self.get_object(id=pk) ser = self.get_serializer(book, data=data) # 3. 处理数据 --》 更新数据 ser.is_valid(raise_exception=True) ser.save() # 4. 返回结果 return Response(ser.data) def delete(self, request, pk): """ 删除单一图书 :param request: :param pk: :return: """ pass