django基于restframework的CBV封装
一.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)
django基于restframework的CBV封装的更多相关文章
- 通过django的rest-framework……(CBV)
为什么不使用FBV,因为CBV重用性很高 先看一个例子: from django.views.generic.base import View from django.http import Http ...
- Python学习---django知识补充之CBV
Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> ...
- Django 反向解析 request CBV
正则路径中的分组 无名分组 分组的概念:就是给某一段正则表达式用小括号括起来 无名分组按位置传参数,一一对应. view中除去request,其他形参数量要与urls中分组数量一致. 无名分组就是将括 ...
- Django基础七之CBV装饰器和中间件
Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...
- Android基于Retrofit2.0 +RxJava 封装的超好用的RetrofitClient工具类(六)
csdn :码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51958010 RetrofitClient 基于Retrofit2 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- Django基于正则表达式的URL(2)
Django基于正则表达式的URL(2) 1. 关于正则的说明 url(r'^detail-(\d+)-(\d+).html',views.detail), 当客户端输入 127.0.0.1:8000 ...
- 简单的基于promise的ajax封装
基于promise的ajax封装 //调用方式: /* ajaxPrmomise({ url:, method:, headers:{} }).then(res=>{}) */ ;(functi ...
- C#工具类OracleHelper,基于Oracle.ManagedDataAccess.Client封装
基于Oracle.ManagedDataAccess.Client封装的Oracle工具类OracleHelper,代码如下: using System; using System.Data; usi ...
随机推荐
- linux audit (9)--生成audit报表
aureport这个命令可以生成一个总结性的柱状图报表,默认情况下,在/var/log/audit目录下的所有日志文件都会生成一个报表,也可以使用如下命令来指定一个不同的文件,aureport opt ...
- python数据结构与算法第十四天【二分查找】
1.二分查找的原理 对于已经排序的列表进行最快速度的查找 2. 代码实现 (1)递归实现 def binary_search(alist, item): if len(alist) == 0: ret ...
- 老男孩python学习自修第四天【字典的使用】
dict = {key1:value1, key2:value2} 定义字典 dict[key] = value 设置字典中指定健的值 dict.pop(key) 删除字典中指定健 dict.popi ...
- jmeter元素
1 test plan functional test mode 选择项:如果勾选 jmeter 会记录从服务器返回的响应数据,如果监视器-选择了文件-则会保存到对应文件 测试jmeter是否配置正确 ...
- Calendar用法随笔
平时在处理时间问题的时候,一般会想到用java.util.Date类型,在使用倒时间的运算的时候,就不是很方便,找找到了java.util.Calendar类,中文意思是“日历”,以下就是自己对这个类 ...
- Codeforces Round #475 Div. 1
B:当n是偶数时无解,因为此时树中有奇数条边,而我们每次都只能删除偶数条.当n是奇数时一定有解,因为此时不可能所有点度数都为奇数,只要找到一个度数为偶数的点,满足将它删掉后,各连通块大小都为奇数就可以 ...
- P1055 书号
P1055 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字.11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号 ...
- Eliminate the Conflict HDU - 4115(2-sat 建图 hhh)
题意: 石头剪刀布 分别为1.2.3,有n轮,给出了小A这n轮出什么,然后m行,每行三个数a b k,如果k为0 表示小B必须在第a轮和第b轮的策略一样,如果k为1 表示小B在第a轮和第b轮的策略不一 ...
- 一个有关FWT&FMT的东西
这篇文章在讲什么 相信大家都会FWT和FMT. 如果你不会,推荐你去看一下VFK的2015国家集训队论文. 设全集为\(U=\{1,2,\ldots,n\}\),假设我们关心的\(f_S\)中的集合\ ...
- thinkPHP框架5.0 类图下载
thinkPHP5.0 类图下载