飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一: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="删除成功")
posted on 2020-09-21 13:02  飞行的猪哼哼  阅读(32)  评论(0)    收藏  举报