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遍历目录的方法小结
Apr 28 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
python模拟事件触发机制详解
Jan 19 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
Python控制Firefox方法总结
Jun 03 Python
用Python配平化学方程式的方法
Jul 20 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
Python读取图像并显示灰度图的实现
Dec 01 Python
Python anaconda安装库命令详解
Oct 16 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
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
Python实现控制台进度条功能
2016/01/04 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
python中cPickle类使用方法详解
2018/08/27 Python
python中退出多层循环的方法
2018/11/27 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
校园歌手大赛策划书
2014/01/17 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
雷锋电影观后感
2015/06/10 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书