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实现截屏的函数
Jul 26 Python
windows下ipython的安装与使用详解
Oct 20 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
Python Logging 日志记录入门学习
Jun 02 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
python根据时间获取周数代码实例
Sep 30 Python
python使用HTMLTestRunner导出饼图分析报告的方法
Dec 30 Python
Python 自由定制表格的实现示例
Mar 20 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
总结Python变量的相关知识
Jun 28 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 MsSql server时遇到的中文编码问题
2009/06/11 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
PHP打印输出函数汇总
2016/08/28 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
URL地址中的#符号使用说明
2011/02/12 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
Python实现的求解最小公倍数算法示例
2018/05/03 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
python基于SMTP协议发送邮件
2019/05/31 Python
如何让python的运行速度得到提升
2020/07/08 Python
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
《九色鹿》教学反思
2014/02/27 职场文书
贺卡寄语大全
2014/04/11 职场文书
活动总结的格式
2014/05/07 职场文书
企业文化标语口号
2014/06/09 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
英文商务邀请函范文
2015/01/31 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python