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基于pygame实现的font游戏字体(附源码)
Nov 11 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
Nov 30 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
Python闭包思想与用法浅析
Dec 27 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
Python多进程fork()函数详解
Feb 22 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 11 Python
利用python绘制数据曲线图的实现
Apr 09 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
总结Python使用过程中的bug
Jun 18 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
谈谈PHP语法(5)
2006/10/09 PHP
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
javascript history对象详解
2017/02/09 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
党课学习思想汇报
2014/01/02 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
超市促销活动方案
2014/03/05 职场文书
5s推行计划书
2014/05/06 职场文书
任命书怎么写
2014/06/04 职场文书
新党章心得体会
2014/09/04 职场文书
教师先进事迹材料
2014/12/16 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书