多种view视图和序列化--django2
models.py
from django.db import models # Create your models here.
class Idc(models.Model):
name = models.CharField("机房名称",max_length=)
address = models.CharField("机房地址",max_length=)
phone = models.CharField("联系人",max_length=)
email = models.EmailField("邮件地址",default="null")
letter = models.CharField("IDC简称",max_length=) def __str__(self):
return self.name class Meta:
db_table = 'resources_idc'
models.py
serializers.py
from rest_framework import serializers
from .models import Idc class IdcSerializer(serializers.Serializer):
"""
Idc 序列化类
"""
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(required=True, max_length=32)
address = serializers.CharField(required=True, max_length=256)
phone = serializers.CharField(required=True, max_length=15)
email = serializers.EmailField(required=True)
letter = serializers.CharField(required=True, max_length=5) #必须有create,才能使用save(), data={...} a=IdcSerializer(data=data) a.save()
def create(self, validated_data):
return Idc.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.address = validated_data.get("address", instance.address)
instance.phone = validated_data.get("phone", instance.phone)
instance.email = validated_data.get("email", instance.email)
instance.save()
return instance
serializers.py
版本一 :APIView
自己写get、post等方法
urlpatterns = [
url("^$", views.api_root),
url("^idcs/$", views.IdcList.as_view(), name="idc-list"),
url("^idcs/(?P<pk>[0-9]+)/$", views.IdcDetail.as_view(), name="idc_detail")
]
urlpatterns = format_suffix_patterns(urlpatterns)
from rest_framework.views import APIView
from django.http import Http404 class IdcList(APIView):
def get(self, request, format=None):
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
return Response(serializer.data) def post(self, request, format=None):
serializer = IdcSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST) class IdcDetail(APIView): def get_object(self, pk):
try:
return Idc.objects.get(pk=pk)
except Idc.DoesNotExist:
raise Http404 def get(self, request, pk, format=None):
idc = self.get_object(pk)
serializer = IdcSerializer(idc)
return Response(serializer.data) def put(self, request, pk, format=None):
idc = self.get_object(pk)
serializer = IdcSerializer(idc, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND) def delete(self, request, pk, format=None):
idc = self.get_object(pk)
idc.delete()
return HttpResponse(status=status.HTTP_204_NO_CONTENT)
版本二:使用混合类(generics.GenericAPIView+mixins.RetrieveModelMixin)实现
需要自己重复写get、post方法,因为ListModelMixin没有写get方法
from rest_framework import generics
from rest_framework import mixins class IdcList_V4(generics.GenericAPIView,
mixins.ListModelMixin,
mixins.CreateModelMixin):
queryset = Idc.objects.all()
serializer_class = IdcSerializer 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 IdcDetail_V4(generics.GenericAPIView,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin):
queryset = Idc.objects.all()
serializer_class = IdcSerializer 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)
版本三:viewset(viewsets.GenericViewSet+mixins)扩展实现
将所有请求用一个class实现,如:GenericViewSet+ListModelMixin
get请求绑定到list之上,post绑定到create
########################## 版本六 ############################
from rest_framework import viewsets class IdcListViewset(viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
mixins.UpdateModelMixin,
mixins.CreateModelMixin):
queryset = Idc.objects.all()
serializer_class = IdcSerializer
urls.py绑定参数:
idc_list = views.IdcListViewset.as_view({
"get": "list",
"post": "create"
})
idc_detail = views.IdcListViewset.as_view({
"get": "retrieve",
"put": "update",
"delete": "destroy"
})
urlpatterns = [
#url("^$", views.api_root),
url("^idcs/$", idc_list, name="idc-list"),#此时,url中不需要再加as_view()了
url("^idcs/(?P<pk>[0-9]+)/$", idc_detail, name="idc_detail")
]
或者用router实现自动绑定get 和list,create 和 post等等
from rest_framework.routers import DefaultRouter # 导入
from django.urls import path
#实例化router
router = DefaultRouter()
# 注册idc
router.register(r'idc', IdcListViewset, base_name="idcs")
urlpatterns = [
# router的path路径
path('', include(router.urls)),
]
版本四:使用高级混合(generics.ListCreateAPIView等)实现
父类包含具体请求方式,如:ListCreateAPIView包括了get

urlpatterns = [
url("^$", views.api_root),
url("^idcs/$", views.IdcList_V5.as_view(), name="idc-list"),
url("^idcs/(?P<pk>[0-9]+)/$", views.IdcDetail_V5.as_view(), name="idc_detail")
]
urlpatterns = format_suffix_patterns(urlpatterns)
from rest_framework import generics
class IdcList_V5(generics.ListCreateAPIView):#包括查找和创建
queryset = Idc.objects.all()
serializer_class = IdcSerializer
class IdcDetail_V5(generics.RetrieveUpdateDestroyAPIView): #包括 详细查找 、更新和删除
queryset = Idc.objects.all()
serializer_class = IdcSerializer
版本五: ModelViewSet(router)实现:
整合:ModelViewSet包括所有方法
########################## 版本七 ############################
from rest_framework.routers import DefaultRouter route = DefaultRouter()
route.register("idcs", views.IdcViewset_v7)
urlpatterns = [
url(r'^', include(route.urls))
]
class IdcViewset_v7(viewsets.ModelViewSet):
queryset = Idc.objects.all()
serializer_class = IdcSerializer
多种view视图和序列化--django2的更多相关文章
- Django的View(视图)和路由系统
一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...
- 8、ASP.NET MVC入门到精通——View(视图)
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官 ...
- NET MVC 升级到5.1后,View视图中代码报错
使用nuget将项目中MVC4 升级到MVC5,之后项目还可以正常编译运行, 但View视图中相关的很多代码都报错,比如: 1.@model找不到 2.@Html找不到,本该是System.Web.M ...
- Django框架 之 view视图
Django框架 之 view视图 浏览目录 概述 简单的视图 HttpRequest对象 CBV和FBV 给视图加装饰器 Request对象 Response对象 JsonResponse对象 Dj ...
- DNS主从服务,子域授权,view视图,日志系统,压力测试
DNS主从服务,子域授权,view视图,日志系统,压力测试 DNS性能测试工具queryperfDNS查询过程: DNS主从建立: 环境: 主服务器:10.140.165.93 从服务器:10.140 ...
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(四)Alert View视图 学习笔记
当我们的应用电量不足的时候,就需要警告提示,那么我们可以用Alert View视图 实现:
- view视图文件中的input等输入框必须含有name属性,不然控制器里的动作formCollection是没有值的
view视图文件中的input等输入框必须含有name属性,不然控制器里的动作formCollection是没有值的,就是没有name属性,后台获取不到值
- MVC(Model(模型) View(视图) Controller(控制器))
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
- ThinkPHP框架视图详细介绍 View 视图--模板(九)
原文:ThinkPHP框架视图详细介绍 View 视图--模板(九) 视图也是ThinkPHP使用的核心部分: 一.模板的使用 a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和 ...
随机推荐
- spring 机制 扫描包
控制器示例 扫描包注解代码 @SpringBootApplication(scanBasePackages = {"cn.maxhou.*"}) 引号内为包名,支持*通配符 为什么 ...
- tcp与串口透传(select)
介绍 tcp作为服务端,监听端口8888,实现串口透传,这里是使用select监听tcp的receive和串口的read,单工通信 -p 指定tcp端口 -s 指定串口 -b 指定波特率 支持4800 ...
- elasticsearch备份脚本
1.主要文件 [root@k8s elasticsearch]# tree . ├── backup_es.sh ├── indices_file.txt ├── recover_es.sh └── ...
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- kafka consumer 的配置(五)
fetch.min.bytes. #获取最小字节数据 Consumer 向broker中要数据时是按大小来返回的,如果数据没有达到指定的MB,consumer会处于等待状态,直到broker 从pro ...
- Java Mysql--链接数据库,数据库字段比较
连接库操作: package com.qa.xxx; import org.springframework.stereotype.Component; import java.lang.reflect ...
- PHP和js判断访问设备是否是微信浏览器实例
PHP和js判断访问设备是否是微信浏览器实例,代码非常精简,适合新手学习. js判断是否是微信浏览器: 1 function is_weixin() { 2 var ua = window.navig ...
- Python爬取猫眼电影排行
import requests import pyquery def crawl_page(url: str) -> None: headers = { 'user-agent': 'Mozil ...
- 【转载】Jmeter接口测试+压力测试
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要 ...
- POJ 1789 Prim
给定N个字符串,某个字符串转为另一个字符串的花费为他们每一位不相同的字符数. 求最小花费Q. Input 多组输入,以0结束. 保证N不超过2000. Output 每组输出"The hig ...