博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django前后端分离实践之DRF--05
阅读量:7040 次
发布时间:2019-06-28

本文共 3951 字,大约阅读时间需要 13 分钟。

一、基于类的视图(CBV)

1. 导入模块

from rest_framework.views import APIView

2. GET

from .models import Publisherfrom app01 import serializersfrom rest_framework.response import Responsefrom rest_framework import statusfrom rest_framework.views import APIViewclass PublisherList(APIView):    """    列出所有的出版,get    或者创建一个新的出版社post    """    def get(self, request, format=None):        queryset = Publisher.objects.all()  # 查询出所有出版社        s = serializers.PublisherSerializer(queryset, many=True)        return Response(s.data, status=status.HTTP_200_OK)

2. POST

def post(self,request,format=None):        s = serializers.PublisherSerializer(data=request.data)        if s.is_valid():            s.save()            return Response(s.data,status=status.HTTP_201_CREATED)        else:            return Response(s.errors,status=status.HTTP_400_BAD_REQUEST)

[站外图片上传中...(image-58db01-1540132721236)]

4. 具体的某一个出版社CBV

class PublisherDetail(APIView):    """    具体的某一个出版社  查看.修改.删除的视图    """    # 需要先尝试的从数据库查到 pk对应的数据,如果没有返回404    def get_object(self, pk):        try:            return Publisher.objects.get(pk=pk)        except Publisher.DoesNotExist:            raise Http404 # 需要先导入 from django.http import Http404
  • GET 获取出版社信息(单个)
def get(self, request, pk, format=None):        publisher = self.get_object(pk)        s = serializers.PublisherSerializer(publisher)        return Response(s.data, status=status.HTTP_200_OK)
  • PUT 修改出版社信息(单个)
def put(self, request, pk, format=None):        publisher = self.get_object(pk)        s = serializers.PublisherSerializer(publisher, data=request.data)        if s.is_valid():            s.save()            return Response(s.data)        else:            Response(s.errors, status=status.HTTP_400_BAD_REQUEST)

[站外图片上传中...(image-9b7a91-1540132721236)]

  • DELETE  删除出版社信息(单个)
def delete(self, request, pk, format=None):        """删除出版社信息"""        publisher = self.get_object(pk)        publisher.delete()        return Response(status=status.HTTP_204_NO_CONTENT)

5. 修改url

url(r'^publishers/$', views.PublisherList.as_view()),url(r'^publishers/(?P
[0-9]+)/$', views.PublisherDetail.as_view()),

[站外图片上传中...(image-f8ff24-1540132721236)]

二、使用混合(mixins)

使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。

到目前为止,我们使用的创建/获取/更新/删除操作和我们创建的任何基于模型的API视图非常相似。这些常见的行为是在REST框架的mixin类中实现的。

1.导入模块

from rest_framework import mixinsfrom rest_framework import generics

2.编写视图

from rest_framework import mixinsfrom rest_framework import genericsclass PublisherList(mixins.ListModelMixin,                    mixins.CreateModelMixin,                    generics.GenericAPIView):    queryset = Publisher.objects.all()    serializers_class = serializers.PublisherSerializer    def get(self, request, *args, **kwargs):        return self.list(request, *args, **kwargs)    def post(self, request, *args, **kwargs):        return self.create(request, *args, **kwargs)
img_e799252bbfe32705a1763eb7808412e2.png
选区_191
class PublisherDetail(mixins.RetrieveModelMixin,                      mixins.UpdateModelMixin,                      mixins.DestroyModelMixin,                      generics.GenericAPIView):    queryset = Publisher.objects.all()    serializer_class = serializers.PublisherSerializer    def get(self, request, *args, **kwargs):        return self.retrieve(request, *args, **kwargs)    def put(self, request, *args, **kwargs):        return self.update(request, *args, **kwargs)    def delete(self, request, *args, **kwargs):        return self.destroy(request, *args, **kwargs)
  • 刷新浏览器
img_eb9ef7df40dbfbec97d4194eebcabb76.png
选区_192

3.改进混合视图

class PublisherList(generics.ListCreateAPIView):    queryset = Publisher.objects.all()    serializer_class = serializers.PublisherSerializer
class PublisherDetail(generics.RetrieveUpdateDestroyAPIView):    queryset = Publisher.objects.all()    serializer_class = serializers.PublisherSerializer
  • 刷新浏览器

[站外图片上传中...(image-de040b-1540132721236)]

[站外图片上传中...(image-b4dc28-1540132721236)]

4. 此时我们观察,代码已经精简至3行

官方文档一句话说的非常好:仅仅只需要很少的几行代码,就可以完成非常清晰,简洁,地道的Django

[站外图片上传中...(image-401930-1540132721236)]

转载地址:http://nwaal.baihongyu.com/

你可能感兴趣的文章
Visual Studio 2010 Ultimate敏捷功能特性(下)
查看>>
为 Neutron 准备物理基础设施(I) - 每天5分钟玩转 OpenStack(75)
查看>>
Android 中文API (91) —— GestureDetector
查看>>
CSS对字体单位的总结
查看>>
统计函数——汇总统计时间类数据
查看>>
精进不休 .NET 4.0 (6) - ADO.NET Data Services 1.5 新特性
查看>>
android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V...
查看>>
熄灯问题
查看>>
引用类型参数,ref按引用传值
查看>>
基于Widnows Server 2003 SP2的系统需要新的系统准备工具
查看>>
C++ 制作 json 数据 并 传送给服务端(Server) 的 php
查看>>
如何从VS2003升级到VS2008
查看>>
Kernel内核的裁剪及移植(三)
查看>>
Oracle10g Bug 4612267 补丁安装备忘录
查看>>
我的Android开源项目:JNote
查看>>
跨线程操作UI
查看>>
关于Unity加载优化,你可能遇到这些问题
查看>>
在 Windows 7 和 Windows Server 2008 R2 上安装 Windows PowerShell 3.0
查看>>
专访IBM Power总经理 纵览Power 7新特性
查看>>
如何选购台式电脑和笔记本?购买时应注意什么
查看>>