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中字典的基础知识归纳小结
Aug 19 Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
简单谈谈Python中的闭包
Nov 30 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
python学生信息管理系统(初级版)
Oct 17 Python
Python----数据预处理代码实例
Mar 20 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
python3 下载网络图片代码实例
Aug 27 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
Python matplotlib修改默认字体的操作
Mar 05 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开发GUI
2006/10/09 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
Javascript的比较汇总
2016/07/25 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
tensorflow更改变量的值实例
2018/07/30 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
校园奶茶店创业计划书
2014/01/23 职场文书
运动会入场解说词
2014/02/07 职场文书
爱心活动计划书
2014/04/26 职场文书
奥运会口号
2014/06/13 职场文书
心理学专业求职信
2014/06/16 职场文书
个人借款协议书范本
2014/11/17 职场文书
陪护人员误工证明
2015/06/24 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电