【愚公系列】2022年04月 Python教学课程 67-DRF框架之GenericAPIView
【摘要】 一、GenericAPIView此类扩展了 REST 框架的类,为标准列表视图和详细信息视图添加了通常需要的行为。GenericAPIView继承于APIView。以下属性控制基本视图行为。queryset:应用于从此视图返回对象的查询集。通常,必须设置此属性或重写该方法。如果要重写视图方法,请务必调用而不是直接访问此属性,因为将评估一次,并且这些结果将缓存用于所有后续请求。seriali...
一、GenericAPIView
此类扩展了 REST 框架的类,为标准列表视图和详细信息视图添加了通常需要的行为。GenericAPIView继承于APIView。
以下属性控制基本视图行为。
- queryset:应用于从此视图返回对象的查询集。通常,必须设置此属性或重写该方法。如果要重写视图方法,请务必调用而不是直接访问此属性,因为将评估一次,并且这些结果将缓存用于所有后续请求。
- serializer_class:应用于验证和反序列化输入以及序列化输出的序列化程序类。通常,必须设置此属性或重写该方法。
- lookup_field:应用于执行各个模型实例的对象查找的模型字段。缺省值为 。请注意,使用超链接 API时,如果需要使用自定义值,则需要确保 API 视图和序列化程序类都设置了查找字段。
- lookup_url_kwarg:应用于对象查找的 URL 关键字参数。URL conf应包含与此值对应的关键字参数。如果未设置,则默认使用与 相同的值。
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from book.models import BookInfo
from drf_book.serializer import BookSerializer
class BooksGenericAPIView(GenericAPIView):
"""
获取所有图书和保存图书
"""
# 指定查询集属性
queryset = BookInfo.objects.all()
# 指定序列化器
serializer_class = BookSerializer
def get(self, request):
"""
获取所有图书
:param request:
:return:
"""
# 1、查询图书表获取所有图书对象 self.get_queryset() 获取queryset属性中的所有数据
books = self.get_queryset()
# 2、提取所有对象的字段内容
# 初始化生成序列化器对象 self.get_serializer 获取serializer_class所指定的序列化器进行初始化操作
ser = self.get_serializer(books, many=True)
# 使用序列化器对象的data方法获取序列化后的结果
data = ser.data
# 3、返回所有对象字段内容
return Response({'book_list': data})
def post(self, request):
"""
保存图书
:param request:
:return:
"""
# 1、获取保存的图书数据
data = request.data
# 2、验证图书数据字段
ser = self.get_serializer(data=data)
# is_valid是序列化器的验证方法
ser.is_valid(raise_exception=True) # raise_exception=True 验证失败直接返回
# ser.errors获取验证结果信息
# 3、保存图书
# 调用序列化器中封装保存方法create
ser.save()
return Response(ser.data)
class BookGenericAPIView(GenericAPIView):
"""
获取单一图书数据
更新图书
删除图书
"""
# 指定查询集属性
queryset = BookInfo.objects.all()
# 指定序列化器
serializer_class = BookSerializer
def get(self, request, pk):
"""
获取单一图书数据
:param request:
:param pk:
:return:
"""
# 1、根据pk值查询图书对象
try:
# self.get_object()从queryset中获取当前pk所对应的数据对象
book = self.get_object()
except:
return Response({'error': '错误的id值'})
# 2、返回图书数据
ser = self.get_serializer(book)
return Response(
ser.data
)
def put(self, request, pk):
"""
更新图书
:param request:
:param pk:
:return:
"""
# 1、获取保存的图书数据
data = request.data
# 2、验证图书数据字段
try:
book = self.get_object()
except:
return Response({'error': '错误的id值'})
ser = self.get_serializer(book)
# is_valid是序列化器的验证方法
ser.is_valid(raise_exception=True) # raise_exception=True 验证失败直接返回
# 3、更新图书
ser.save()
# # 4、返回保存后的图书数据
return Response(ser.data)
def delete(self, request, pk):
"""
删除图书
:param request:
:param pk:
:return:
"""
# 1、查询删除的图书对象
try:
book = self.get_serializer()
except:
return Response({'error': '错误的id值'})
# 2、逻辑
book.is_delete = True
book.save()
# 物理删除
# book.delete()
# 3、返回结果
return Response({})
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)