django基于restframework的CBV封装详解


Posted in Python onAugust 08, 2019

一.models数据库映射

from django.db import models
# Create your models here.
class Book(models.Model):
  title=models.CharField(max_length=32)
  price=models.IntegerField()
  pub_date=models.DateField()
  publish=models.ForeignKey(to="Publish")
  authors=models.ManyToManyField(to="Author")
  def __str__(self):
    return self.title
class Publish(models.Model):
  name=models.CharField(max_length=32)
  email=models.EmailField()
  def __str__(self):
    return self.name
class Author(models.Model):
  name=models.CharField(max_length=32)
  age=models.IntegerField()
  def __str__(self):
    return self.name

二.serializers序列化

from rest_framework import serializers
from app01 import models
from rest_framework import exceptions
class BookSerialize(serializers.ModelSerializer):
  class Meta:
    model = models.Book
    fields = "__all__"
  publish = serializers.SerializerMethodField()
  authors = serializers.SerializerMethodField()
  def get_publish(self, obj):
    return {"publish_id": obj.publish.pk, "publish_name": obj.publish.name}
  def get_authors(self, obj):
    author_list = obj.authors.all()
    lis = [{"name": author.name, "age": author.age} for author in author_list]
    return lis
  def validate_title(self, value):
    if value.startswith("sb"):
      raise exceptions.ValidationError('你使用了不合适的文字')
    return value

三.url路由

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^books/$', views.Books.as_view()),
]

四.Views视图类

主要就是将CBV的几个get,post请求方法进行封装,以后创建其他的新的CBV,直接继承调用就可以了,可以减少代码冗余

from app01 import models
from rest_framework.response import Response
from rest_framework.views import APIView
from app01.serialize_module import BookSerialize

# 自定义一个response类,方便CBV使用
class MyResponse():
  def __init__(self):
    self.status = 100
    self.msg = None
  # 将类方法装饰成属性
  @property
  def get_dic(self):
    return self.__dict__
# 封装CBV类
# 将get请求封装在List类中
class List():
  def get_list(self, request,*args,**kwargs):
    response = MyResponse()
    try:
      handler_list = self.model.objects.all()
      handler_ser = self.serializer(instance=handler_list, many=True)
      response.handler = handler_ser.data
      response.msg = "获取成功"
    except Exception as e:
      response.msg="获取失败"
      response.error=str(e)
    return Response(response.get_dic)
# 将post请求封装在Create类中
class Create():
  def save(self, request,*args,**kwargs):
    response = MyResponse()
    try:
      handler_ser = self.serializer(data=request.data)
      if handler_ser.is_valid():
        handler_ser.save()
        response.msg = "添加成功"
      else:
        response.status = 101
        response.msg = "添加失败"
        response.error = handler_ser.errors
    except Exception as e:
      response.msg = "添加失败"
      response.error=str(e)
    return Response(response.get_dic)
# book类继承List,Create,APIView
class Books(List,Create,APIView):
  model=models.Book
  serializer=BookSerialize
  # 此时调用get方法时,只要使用List类中的get_list方法就行了
  def get(self,request):
    return self.get_list(request)
  # 此时调用post方法时,只要使用Create类中的save方法就行了
  def post(self,request):
    return self.save(request)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 3.5下xadmin的使用及修复源码bug
May 10 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
python实现BackPropagation算法
Dec 14 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
python async with和async for的使用
Jun 20 Python
python颜色随机生成器的实例代码
Jan 10 Python
Python脚本去除文件的只读性操作
Mar 05 Python
Python检测端口IP字符串是否合法
Jun 05 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 #Python
python 实现手机自动拨打电话的方法(通话压力测试)
Aug 08 #Python
Python generator生成器和yield表达式详解
Aug 08 #Python
利用python实现短信和电话提醒功能的例子
Aug 08 #Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 #Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 #Python
Pycharm远程调试原理及具体配置详解
Aug 08 #Python
You might like
PHP编码规范-php coding standard
2007/03/16 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
JqGrid web打印实现代码
2011/05/31 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
jQuery 选择器详解
2015/01/19 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
初步认识Python中的列表与位运算符
2015/10/12 Python
学习python类方法与对象方法
2016/03/15 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
this关键字的含义
2015/04/08 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
金融行业务员的自我评价
2013/12/13 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
小学二年级评语
2014/04/21 职场文书
会计系毕业生求职信
2014/05/28 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书