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进阶教程之模块(module)介绍
Aug 30 Python
Python中运行并行任务技巧
Feb 26 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 Python
python非递归全排列实现方法
Apr 10 Python
Python实现注册登录系统
Aug 08 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 Python
使用Python正则表达式操作文本数据的方法
May 14 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
Apr 24 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
详解Python生成器和基于生成器的协程
Jun 03 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结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
基于jquery的地址栏射击游戏代码
2011/03/10 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
javascript的函数作用域
2014/11/12 Javascript
JQuery实现鼠标移动图片显示描述层的方法
2015/06/25 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
Python3.5装饰器典型案例分析
2019/04/30 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
如何在python中判断变量的类型
2020/07/29 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
办公自动化专业大学生职业规划书
2014/03/06 职场文书
文艺晚会策划方案
2014/06/11 职场文书
校长创先争优承诺书
2014/08/30 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS