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连接池实现示例程序
Nov 26 Python
详解Python多线程Selenium跨浏览器测试
Apr 01 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
Python global全局变量函数详解
Sep 18 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
Python函数中apply、map、applymap的区别
Nov 27 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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调用Twitter的RSS的实现代码
2010/03/10 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
xml和web特殊字符
2009/04/28 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
react redux入门示例
2018/04/19 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
python提取字典key列表的方法
2015/07/11 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
Python数据结构之图的应用示例
2018/05/11 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
Django框架实现的分页demo示例
2019/05/25 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
PHP面试题及答案一
2012/06/18 面试题
TCP/IP的分层模型
2013/10/27 面试题
电子信息科学专业自荐信
2014/01/30 职场文书
市场营销方案范文
2014/03/11 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
干部作风建设心得体会
2014/10/22 职场文书
普宁寺导游词
2015/02/04 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript