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 内置字符串处理函数的使用方法
Jun 11 Python
Python实现拼接多张图片的方法
Dec 01 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
Python正则捕获操作示例
Aug 19 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python中metaclass原理与用法详解
Jun 25 Python
Python列表与元组的异同详解
Jul 02 Python
Django自关联实现多级联动查询实例
May 19 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 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判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
JQery 渐变图片导航效果代码 漂亮
2010/01/01 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
九种原生js动画效果
2015/11/11 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python创建系统目录的方法
2015/03/11 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
天鹅湖观后感
2015/06/09 职场文书
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS