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实现代码行数统计示例分享
Feb 10 Python
python获取本地计算机名字的方法
Apr 29 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
python字符串的拼接方法总结
Nov 18 Python
python matplotlib实现将图例放在图外
Apr 17 Python
Python语言编写智力问答小游戏功能
Oct 13 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 rand()造成CPU 100%的解决办法
2010/05/18 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
javascript操作cookie
2017/01/17 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
2018/03/09 jQuery
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
Python pickle模块用法实例
2015/04/14 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
Python中super函数用法实例分析
2019/03/18 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
如何在django中实现分页功能
2020/04/22 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
护士自荐信怎么写
2013/10/18 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
部队个人年终总结
2015/03/02 职场文书
研讨会致辞
2015/07/31 职场文书