APIView

基类 APIView

  • rest_framework.views.APIView: 是REST framework提供的所有视图的基类,继承自Django的View父类。
  • APIViewView的不同之处在于:

    • 接收的是REST framework的Request对象,而不是Django的HttpRequeset对象;
    • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
    • 处理请求前会对请求进行身份认证、权限检查、流量控制
    • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  • APIView支持定义的属性:

    • authentication_classes 列表或元组,身份认证类
    • permissoin_classes 列表或元组,权限检查类
    • throttle_classes 列表或元组,流量控制类

案例: APIView 结合 序列化器 使用

# users/urls.py
url(r'^departments/$', views.DepartmentListAPIView.as_view()),
url(r'^departments/(?P<pk>\d+)/$', views.DepartmentDetailAPIView.as_view()),

# users/views.py
class DepartmentListAPIView(APIView):

    def get(self, request):
        """查询多条数据"""
        # 查询所有的部门对象
        query_set = Department.objects.all()
        # 创建序列化器(当传入的对象有多个时需要指定many=True)
        serializer = DepartmentSerializer(query_set, many=True)
        # 返回响应对应
        return Response(serializer.data)

    def post(self, request):
        """新增一条数据"""
        # 创建序列化对象
        serializer = DepartmentSerializer(data=request.data)
        # 验证参数合法性
        # 设置raise_exception=True后,出错时,会给客户端返回json出错信息
        serializer.is_valid(raise_exception=True)
        # 保存部门到数据库表中
        serializer.save()
        # 返回响应对象
        return Response(serializer.data)

class DepartmentDetailAPIView(APIView):

    def get(self, request, pk):
        """查询一条数据"""
        try:
            department = Department.objects.get(pk=pk)
        except Department.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        # 创建序列化对象
        serializer = DepartmentSerializer(department)
        # 返回响应对象,并传递字典数据
        return Response(serializer.data)

    def put(self, request, pk):
        """修改部门"""
        # 要修改的部门对象
        try:
            department = Department.objects.get(pk=pk)
        except Department.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)
        # 创建序列化器对象
        serializer = DepartmentSerializer(department, data=request.data)
        # 验证参数合法性
        # raise_exception=True: 如果校验不通过,会返回json出错信息给客户端
        serializer.is_valid(raise_exception=True)
        # 保存数据到数据库中
        # 上面的代码,当创建DepartmentSerializer对象时,第一个参数传入了部门对象,
        # 则在调用save()方法时,会修改部门,如果没有传入对象,则会新增部门
        serializer.save()
        return Response(serializer.data)

    def delete(self, request, pk):
        # 删除一个部门  DELETE  /departments/<pk>
        # 查询要删除的部门对象
        try:
            department = Department.objects.get(pk=pk)
        except Department.DoesNotExist:
            return Response(status=404)
        # 删除部门
        department.delete()
        # 响应请求
        return Response(status=204)
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值