一:DRF基本视图继承关系简图:

二:APIView的使用
1:定义两个序列化器:
from rest_framework import serializers
from .models import *
class BookInfoModelSerializers(serializers.ModelSerializer):
class Meta:
model = BookInfo
fields = "__all__"
class HeroInfoModelSerializers(serializers.ModelSerializer):
class Meta:
model = HeroInfo
fields= "__all__"
2:了解5大逻辑:
| 新建单一视图 | 反序列化新建单一模型类对象 |
|---|---|
| 更新单一资源 | 反序列化更新单一模型类对象 |
| 删除单一资源 | 反序列化删除单一模型类对象 |
| 获取列表资源 | 序列化返回多个模型类对象 |
| 获取单一资源 | 序列化返回单一模型类对象 |
3:使用APIview 获取资源:
3.1:获取列表资源:
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
from books.models import BookInfo
from books.serializers import BookInfoModelSerializers
# 1:继承于APIView
class BookView(APIView):
def get(self, request):
# 2:获取数据
books = BookInfo.objects.all()
# 3: 列表进行序列化,serializers.data得到的就是列表套字典的格式
bs = BookInfoModelSerializers(instance=books, many=True)
# 4:构造响应返回
return Response(
data=bs.data,
status=status.HTTP_200_OK,
headers={"server-version": "v1.0"},
content_type= "application/json",
)
3.2:新建单一资源:
def post(self, request):
bs = BookInfoModelSerializers(data=request.data)
if not bs.is_valid():
return Response(
data={"errmsg": "信息填写错误"},
status=status.HTTP_400_BAD_REQUEST,
)
bs.save()
return Response(
data=bs.data,
status=status.HTTP_200_OK,
headers={"server-version": "v1.0"},
content_type="application/json",
)
测试:json

使用表单测试:

结论:request.data⽤于提取请求体参数;会⾃动更具请求头Content_Type指定的json格式或表单格式,⾃动提取并转化成字典封装在request.data属性中。
3.3:获取列表资源:
class BookView(APIView):
def get(self, request):
key_word = request.query_params.get("keyword")
if key_word:
books = BookInfo.objects.filter(btitle__contains=key_word)
else:
# 2:获取数据
books = BookInfo.objects.all()
# 3: 列表进行反序列化,serializers.data得到的就是列表套字典的格式
bs = BookInfoModelSerializers(instance=books, many=True)
# 4:构造响应返回
return Response(
data=bs.data,
status=status.HTTP_200_OK,
headers={"server-version": "v1.0"},
content_type= "application/json",
)
测试:

如果传入多个值,那么会出现怎么样的效果??

结论:request.query_params⽤于提取请求的查询字符串参数;类型是⼀个多值字典QueryDict。
request.query_params.get(“keyword”): 提取最后⼀个。
问题:如果想要得到所有的怎么做?
使用getlist
key_word = request.query_params.getlist("keyword")
使用列表必须传入的完全相同才能查到。

如何查询到包含牛和传的所有查询集呢?


4:序列化获取单一资源:
class BookView(APIView):
# 序列化获取单一资源
def get(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return Response(data="没有当前id的书")
bs = BookInfoModelSerializer(instance=book)
return Response(data=bs.data)
测试:

5:反序列化更新单一资源—全校验
# 反序列化更新单一模型类对象
def put(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return Response(data="数据库中没有数据")
sz = BookInfoModelSerializer(instance=book, data=request.data)
if not sz.is_valid():
return Response(data="校验失败")
sz.save()
return Response(data=sz.data)
测试:必传的必须传。


6: 反序列化更新单一资源----部分更新
def patch (self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return Response(data="数据库中没有数据")
sz = BookInfoModelSerializer(instance=book, data=request.data, partial=True)
if not sz.is_valid():
return Response(data="校验失败")
sz.save()
return Response(data=sz.data)
测试:

7: 反序列化删除单一资源:
def delete(self, request, pk):
try:
book = BookInfo.objects.get(pk=pk)
except Exception as e:
return Response(data="你要删除的数据不存在")
book.delete()
return Response(data="删除成功")
浙公网安备 33010602011771号