1、DRF基本视图继承关系简图
代码实现
- 1、获取列表资源——序列化返回多个模型类对象,查询字符串方式
/books/?keyword=传
request.query_params
用于提取查询字符串参数
注:函数chain(value1,value2,…):用来合并多个查询集
from itertools import chain
from rest_framework.response import Response
from rest_framework.views import APIView
from .serializers import *
class BooksView(APIView):
# 1、获取列表资源——序列化返回多个模型类对象
def get(self, request):
# keyword = request.query_params.get('keyword')
keyword = request.query_params.getlist('keyword') # 得到的keyword是一个列表
if keyword:
books_all = BookInfo.objects.filter(pk=-1)
for str in keyword:
books = BookInfo.objects.filter(btitle__contains=str)
books_all = chain(books_all, books) # chain:用来合并多个查询集
else:
books_all = BookInfo.objects.all()
bs = BookInfoModelSerializer(instance=books_all, many=True)
return Response(
data=bs.data,
status=200,
# headers={'server-version': 'v1.0'},
# content_type='application/json'
)
- 主路由映射:
from django.contrib import admin
from django.urls import path,re_path
from books_test.views import *
urlpatterns = [
path('admin/', admin.site.urls),
# 获取多个对象
re_path(r'^books/$', BooksView.as_view()),
# 获取单一资源:GET + /books/(?P<pk>\d+)/ = self.get
re_path(r'^books/(?P<pk>\d+)/$', BookView.as_view()),
]
- 2、新建单一资源——反序列化新建单一模型类对象
request.data
用于提取请求体参数
注:如果请求体是表单,提取到的也是多值字段类型QueryDict,也支持get提取的是最后的value
值
# 2、新建单一资源——反序列化新建单一模型类对象
def post(self, request):
bs = BookInfoModelSerializer(data=request.data)
if not bs.is_valid():
return Response(data={'errmsg': '参数有误'}, status=400)
bs.save()
return Response(
data=bs.data,
status=200
)
- 3、获取单一资源 —— 序列化返回单一模型类对象
- 4、更新单一资源 —— 反序列化更新单一模型类对象
- 5、删除单一资源 —— 反序列化删除单一模型类对象
class BookView(APIView):
# 3、获取单一资源 —— 序列化返回单一模型类对象
# GET + /books/1/
def get(self, request, pk):
# 1、提取参数
# 2、校验参数
# 3、数据处理 —— 序列化返回单一资源
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist as e:
return Response(data={'errmsg': '404 not found'}, status=status.HTTP_404_NOT_FOUND)
serializer = BookInfoModelSerializer(instance=book)
# 4、构建响应
return Response(data=serializer.data)
# 4、更新单一资源 —— 反序列化更新单一模型类对象
# 4.2、全更新(全校验):PUT + /books/1/
def put(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist as e:
return Response(data={'errmsg': '404 not found'}, status=status.HTTP_404_NOT_FOUND)
serializer = BookInfoModelSerializer(instance=book, data=request.data)
if not serializer.is_valid():
return Response(data={'errmsg': '数据有误'}, status=status.HTTP_400_BAD_REQUEST)
# 一旦调用save函数,instance对象就被更新/新建,那么我们后续还可以使用data来获取该对象序列化的结果
serializer.save()
return Response(data=serializer.data)
# 4.2、部分更新(部分校验):PATCH + /books/1/
def patch(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist as e:
return Response(data={'errmsg': '404 not found'}, status=status.HTTP_404_NOT_FOUND)
# partial=True表示部分校验
serializer = BookInfoModelSerializer(instance=book, data=request.data, partial=True)
if not serializer.is_valid():
return Response(data={'errmsg': '数据有误'}, status=status.HTTP_400_BAD_REQUEST)
# 一旦调用save函数,instance对象就被更新/新建,那么我们后续还可以使用data来获取该对象序列化的结果
serializer.save()
return Response(data=serializer.data)
# 5、删除单一资源 —— 反序列化删除单一模型类对象
# DELETE + /books/1/
def delete(self, request, pk):
# 删除动作不经过序列化器
try:
book = BookInfo.objects.get(pk=pk)
except BookInfo.DoesNotExist as e:
return Response(data={'errmsg': '404 not found'}, status=status.HTTP_404_NOT_FOUND)
book.delete()
return Response(data=None, status=status.HTTP_204_NO_CONTENT)