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之编写类之四再论继承
Oct 11 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
Python实现购物车程序
Apr 16 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
Python爬虫实现爬取百度百科词条功能实例
Apr 05 Python
Python数据类型之Dict字典实例详解
May 07 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
在Django中使用MQTT的方法
May 10 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的图形函数中显示汉字
2006/10/09 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
2019/09/17 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
微信小程序实现分页加载效果
2020/11/19 Javascript
Python os模块介绍
2014/11/30 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
python实现RSA加密(解密)算法
2016/02/17 Python
python多线程之事件Event的使用详解
2018/04/27 Python
python和shell获取文本内容的方法
2018/06/05 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Python Pandas数据结构简单介绍
2019/07/03 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
大专生自荐书范文
2014/06/22 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
Linux中如何安装并部署Redis
2022/04/18 Servers
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python
vue使用watch监听属性变化
2022/04/30 Vue.js