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中使用dom模块生成XML文件示例
Apr 05 Python
Django中对数据查询结果进行排序的方法
Jul 17 Python
详细分析python3的reduce函数
Dec 05 Python
基于数据归一化以及Python实现方式
Jul 11 Python
python文件拆分与重组实例
Dec 10 Python
详解python数据结构和算法
Apr 18 Python
python rsync服务器之间文件夹同步脚本
Aug 29 Python
Python模块的制作方法实例分析
Dec 21 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python装饰器如何实现修复过程解析
Sep 05 Python
python 实现IP子网计算
Feb 18 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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来写记数器(详细介绍)
2006/10/09 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
json数据的列循环示例
2013/09/06 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
JavaScript错误处理
2015/02/03 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python中reader的next用法
2018/07/24 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
python 实现音频叠加的示例
2020/10/29 Python
button在IE6/7下的黑边去除方案
2012/12/24 HTML / CSS
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
数据库测试通常都包括哪些方面
2015/11/30 面试题
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS