视图部分小结:

 # as_view()中的参数:利用参数(一个字典)来指定什么方式用什么方法来执行(哪种请求方式由哪种内部方法来执行)
# 例如 Retrieve时,需要在对应的url中添加有名分组 "pk":?P<pk> ,这样 retrieve()等方法中的 get_object()方法才能取到相应的记录对象 # 流程分析:
1. re_path(r"^authors/$",views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
2. re_path(r"^authors/$",ViewSetMixin.as_view({"get":"list","post":"create"}),name="author"),
3. re_path(r"^authors/$",ViewSetMixin.view,name="author"), 4. 一旦用户访问 /authos/(如 get请求):
ViewSetMixin.view():
for method, action in actions.items(): # {"get":"list","post":"create"}
handler = getattr(self, action) # self.list self.create
setattr(self, method, handler) # self.get = self.list # self.post = self.create # getattr(self,"get") # self.list
# getattr(self,"post") # self.create return self.dispatch() APIView.dispatch():
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower()) response = handler(request, *args, **kwargs) # self.list() return response

(1)视图初级版:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers from rest_framework import serializers class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="__all__"
#depth=1 class PublshSerializers(serializers.ModelSerializer): class Meta:
model=Publish
fields="__all__"
depth=1 class BookViewSet(APIView):

   # 查看所有数据
def get(self,request,*args,**kwargs):
book_list=Book.objects.all()
bs=BookSerializers(instance=book_list,many=True,context={'request': request}) # 当 BookSerializers 中有 HyperlinkedIdentityField 时,其实例化时需要加上 context={'request':request}
return Response(bs.data) # 要返回 bs.data    # 新添加一条记录
def post(self,request,*args,**kwargs):
print(request.data)
          # 创建记录时的序列化
bs=BookSerializers(data=request.data,many=False)
if bs.is_valid():
print(bs.validated_data)
bs.save() # .save() 中有 create() 方法
return Response(bs.data)
else:
return HttpResponse(bs.errors) class BookDetailViewSet(APIView): def get(self,request,pk):
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(instance=book_obj,context={'request': request})
return Response(bs.data)

   # 更新数据
def put(self,request,pk):
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(instance=book_obj,data=request.data,context={'request': request}) # 更新数据时的序列化
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors) class PublishViewSet(APIView): def get(self,request,*args,**kwargs):
publish_list=Publish.objects.all()
bs=PublshSerializers(publish_list,many=True,context={'request': request})
return Response(bs.data) def post(self,request,*args,**kwargs): bs=PublshSerializers(data=request.data,many=False)
if bs.is_valid():
# print(bs.validated_data)
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors) class PublishDetailViewSet(APIView): def get(self,request,pk): publish_obj=Publish.objects.filter(pk=pk).first()
bs=PublshSerializers(publish_obj,context={'request': request})
return Response(bs.data) def put(self,request,pk):
publish_obj=Publish.objects.filter(pk=pk).first()
bs=PublshSerializers(publish_obj,data=request.data,context={'request': request})
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)

(2)mixin类编写视图

from rest_framework import mixins
from rest_framework import generics class BookViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView): queryset = Book.objects.all() # queryset 变量表示要接收的 queryset;queryset这个名字是固定的
serializer_class = BookSerializers # serializer_class 变量表示要用到的序列化的类;serializer_class 这个名字是固定的 def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs) class BookDetailViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers 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)

(3)使用通用的基于类的视图

上面通过使用mixin类,可以使用更少的代码重写这些视图,但还是可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,可以通过使用它来简化我们的views.py模块

from rest_framework import mixins
from rest_framework import generics class BookViewSet(generics.ListCreateAPIView): queryset = Book.objects.all()
serializer_class = BookSerializers class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializers class PublishViewSet(generics.ListCreateAPIView): queryset = Publish.objects.all()
serializer_class = PublshSerializers class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
queryset = Publish.objects.all()
serializer_class = PublshSerializers

(4)viewsets.ModelViewSet

urls.py部分:

from django.contrib import admin
from django.urls import path,re_path
from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
re_path(r"^books/$",views.BookModelView.as_view({"get":"list","post":"create"})),
re_path(r"^books/(?P<pk>\d+)/$",views.BookModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"})),
# 需要在对应的url中添加有名分组 "pk":?P<pk> ,这样 retrieve()等方法中的 get_object()方法才能取到相应的记录对象
re_path(r"^publish/$",views.PublishModelView.as_view({"get":"list","post":"create"}),name="publish"),
re_path(r"^publish/(?P<pk>\d+)/$",views.PublishModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="publish_detail"),
re_path(r"^login/$",views.LoginView.as_view(),name="login"),
] # as_view() 是否可以加参数,取决于视图的类是否继承 ViewSetMixin

views.py部分:

from app01 import models
from app01 import serializer from rest_framework.views import APIView
from rest_framework.response import Response
# Create your views here. from rest_framework import viewsets class BookModelView(viewsets.ModelViewSet):
queryset = models.Book.objects.all() # queryset 表示要处理的数据;queryset这个变量名是固定的
serializer_class = serializer.BookSerializers # serializer_class 表示 所要用到的 序列化的类;serializer_class 是固定写法 class PublishModelView(viewsets.ModelViewSet):
queryset = models.Publish.objects.all()
serializer_class = serializer.PublishSerializers

继承的类:

class View(object):
class APIView(View)
class GenericAPIView(views.APIView)
class GenericViewSet(ViewSetMixin,generics.GenericAPIView)
class ModelViewSet(
mixins.CreateModelMixin,
mixins.RetriveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet
) from rest_framework.views import APIView # ** 继承 APIView 就是要写原生的 接口(API)
from rest_framework.generics import GenericAPIView
from rest_framework.viewsets import GenericViewSet # GenericViewSet继承的ViewSetMixin,决定了 as_view() 中能加参数
from rest_framework.viewsets import ModelViewSet # ** ModelViewSet 继承了增删改查

补充: model类.objects.update_or_create(user=user_obj,default=...)  # 表中没有就创建,有就更新;# 返回一个元组:第一个是对象,第二个是布尔值

restful(2):视图的更多相关文章

  1. RESTful规范与django编写restful接口

    一.什么是RESTful规范 ①REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” ②REST从资 ...

  2. 优雅的SpringMVC和Restful

    一.前言 1.前段时间一直在写微信小程序的请求,终于把客户端的请求弄好了,可是服务端呢,该怎么写,纠结了半天,用servlet暂时写好了一个:http://www.cnblogs.com/JJDJJ/ ...

  3. 12.Flask-Restful

    定义Restful的视图 安装:pip install flask-restful 如果使用Flask-restful,那么定义视图函数的时候,就要继承flask_restful.Resourse类, ...

  4. SpringBoot系列: 与Spring Rest服务交互数据

    不管是单体应用还是微服务应用, 现在都流行Restful风格,  下图是一个比较典型的使用rest的应用架构, 该应用不仅使用database数据源, 而且用到了一个Weather微服务, 另一方面, ...

  5. rstful登陆认证并检查session是否过期

    一:restful用户视图 #!/usr/bin/env python # -*- coding:UTF-8 -*- # Author:Leslie-x from users import model ...

  6. spring_restful_json_jdbc

    使用Spring MVC +JDBC 实现输出Json数据和视图两种形式 最后面有源代码 从web.xml開始配置: 声明定义两个Servlet各自是输出视图和json <!-- 声明一个Ser ...

  7. Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总

    Spring研磨分析.Quartz任务调度.Hibernate深入浅出系列文章笔记汇总 置顶2017年04月27日 10:46:45 阅读数:1213 这系列文章主要是对Spring.Quartz.H ...

  8. Flask_restful 插件实战笔记——基本概念与使用

       最近在Resetful接口设计上想法还是挺多的,也实现了一些需求!想着整理下Flask_restful插件的基本知识,方便日后的复习!   官方地址:https://flask-restful. ...

  9. Flask-Restful

    定义Restful的视图 安装:pip install flask-restful 如果使用Flask-restful,那么定义视图函数的时候,就要继承flask_restful.Resourse类, ...

  10. 第 3 篇:实现博客首页文章列表 API

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 此前在讨论基于模板引擎的开发方式和 django-rest-framework 开发 ...

随机推荐

  1. lavas安装

    最近在研究pwa,百度基于此写了一套开源框架lavas,学习下: 1.环境准备: lavas 安装.git安装 Node.js:https://nodejs.org/ Git:https://git- ...

  2. break跳出嵌套循环体

    package com.wh.Object; public class Test { public static void main(String[] args) { // TODO Auto-gen ...

  3. gcc 编译 c++ 程序(转载)

    单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #include <iostream& ...

  4. Python 学习之Virtualenv

    Virtualenv是一个python环境的隔离工具,主要解决库的隔离和权限问题 Refer:中文版Virtualevn解释 用virtualenv创建多个python环境 我们360如何使用pyth ...

  5. 解决asp.net 以及MVC中上传文件大小限制的问题

    ﹤system.web﹥ ﹤httpruntime requestlengthdiskthreshold="256" maxrequestlength="2097151& ...

  6. [转]查询表达式 (F#)

    本文转自:http://msdn.microsoft.com/zh-cn/library/hh225374.aspx 查询表达式可以查询数据源并将数据是一种预期形式.             查询表达 ...

  7. PHP到浏览器的缓存机制

    参考地址:http://www.cnblogs.com/godok/p/6341300.html 所有的php程序员都知道在php脚本里面执行 echo “1”;访客的浏览器里面就会显示“1”. 但是 ...

  8. 使用Jenkins进行android项目的自动构建(4)

    加入单元测试 android单元测试很多都是使用Instrumentation进行的,这里讲的是试用JUnit,为什么用JUnit呢?因为使用Instrumentation需要打包apk安装,然后再进 ...

  9. qt5.8 链接mysql错误:driver not load

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7155858.html 问题:qt5.8 链接mysql错误:driver not load. 解决方案:1.安 ...

  10. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...