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 常用string函数(收藏)
May 30 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
Django基础之Model操作步骤(介绍)
May 27 Python
Python实现登录接口的示例代码
Jul 21 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
python写入并获取剪切板内容的实例
May 31 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
python在openstreetmap地图上绘制路线图的实现
Jul 11 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
mac在matplotlib中显示中文的操作方法
Mar 06 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 Xdebug的安装与使用详解
2013/06/20 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
js 数组操作代码集锦
2009/04/28 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
vue点击标签切换选中及互相排斥操作
2020/07/17 Javascript
详解vue路由
2020/08/05 Javascript
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
Python常用算法学习基础教程
2017/04/13 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Python无损压缩图片的示例代码
2020/08/06 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
最新奶茶店创业计划书
2014/01/25 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
借款协议书
2014/09/16 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
物流业务员岗位职责
2015/04/03 职场文书
初三英语教学反思
2016/02/15 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
详解Python中下划线的5种含义
2021/07/15 Python