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中SocketServer模块处理网络请求的用法
Jun 28 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
Python3用tkinter和PIL实现看图工具
Jun 21 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
Django接收post前端返回的json格式数据代码实现
Jul 31 Python
pytorch 自定义数据集加载方法
Aug 18 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
Python字典和列表性能之间的比较
Jun 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学习之数组值的操作
2011/04/17 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
小程序自定义单页面、全局导航栏的实现代码
2019/03/15 Javascript
JS实现密码框效果
2020/09/10 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
Python Sleep休眠函数使用简单实例
2015/02/02 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python迭代dict的key和value的方法
2018/07/06 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
大专毕业生自我鉴定
2013/11/21 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
务虚会发言材料
2014/12/25 职场文书
期末考试复习计划
2015/01/19 职场文书
土地租赁协议书
2015/01/29 职场文书
单位政审意见范文
2015/06/04 职场文书
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技