一、序列化类的增、删、改、查

  用drf的序列化组件
   -定义一个类继承class BookSerializer(serializers.Serializer):
   -写字段,如果不指定source,字段名必须跟数据库字段名对应(source指定的值跟字段名不能重复)
   -source还可以指定方法
   -publish=serializers.SerializerMethodField()
   def get_publish(self,obj):
    obj.publish
    #obj.authors.all()
    
  - Serializer
  -ModelSerializer
   class Meta:
    # 指定表模型
    model = models.Book
    # 序列化所有字段
    fields = '__all__'
    # 只想序列化title和id这俩字段
    # fields = ['title', 'id']
    # exclude 和fields 不要连用
    # exclude = ['title']
    depth=1

# 先创建一个序列化的类继承ModelSerializer

# ModelSerializer跟表模型绑定序列化
from app import models class BookSerializer(serializers.ModelSerializer):
class Meta:
# 指定表模型
model = models.Book
# 序列化所有的字段
fields = '__all__'
# 只想序列化title和id两个字段
# fields = ['title','id']
# exclude 和 fields不要连用
# excude = ['title]
# depth深度,表示链表的深度
#不建议使用:下几层要取得参数不能控制,官方建议不要超过10,个人建议不超过3
# depth = 1 # publish = serializers.CharField(source='publish.name')
# authors = serializers.SerializerMethodField()
# def get_authors(self, obj):
# author_list = obj.authors.all()
# author_ser = AuthorSer(instance=author_list, many=True)
# return author_ser.data #为书名增加自定义需求
title = serializers.CharField(max_length=6,min_length=3,error_messages={'max_length':'太长了'}) #也有局部钩子函数
def validate_title(self,value):
from rest_framework import exceptions
print(value)
if value.startswith('tmd'):
raise exceptions.ValidationError('不能以tmd开头')
return value

#新增

from app.MySer import BookSerializer
from django.views import View
from rest_framework.views import APIView
from rest_framework.response import Response
from app import models class Books(APIView): # 新增方法
def post(self,request):
response = {'status':100,'msg':'成功'}
# book = request.data
# 以往是提交字典,创建对象保存
# 新方法时通过序列化组件保存,必须继承自ModelSerializer
# data注意是data
book_ser = BookSerializer(data=request.data)
# is_valid提交的字段通过验证
if book_ser.is_valid():
book_ser.save()
response['book']=book_ser.data
else:
response['msg'] = book_ser.errors
return Response(response)

#删除

class Book(APIView):

    # 删除方法
def delete(self,request,id):
response = {'status': 100, 'msg': '删除成功'}
book = models.Book.objects.filter(pk=id).delete()
return Response(response)

# 修改

class Book(APIView):

    # 修改方法
def put(self,request,id):
response={'status':100,'msg':'成功'}
book = models.Book.objects.filter(pk=id).first()
# 修改的话需要把book对象传过来,实例化ser对象出来
book_ser = BookSerializer(data=request.data,instance=book)
# is_valid提交的字段校验通过
if book_ser.is_valid():
# save既可以修改,又可以更新
book_ser.save()
response['book'] = book_ser.data
else:
response['msg'] = book_ser.errors return Response(response)

# 查询所有

class Books(APIView):
# 查询方法多个
def get(self, request, *args, **kwargs):
response = {'status': 100, 'msg': '成功'}
book_list = models.Book.objects.all()
# 第一个参数是要序列化的queryset对象,如果序列化多条,必须指定many=True
# 问?什么情况下many=False,instance=单个对象的时候
book_ser = BookSerializer(book_list, many=True)
print(book_ser.data)
response['books'] = book_ser.data
return Response(response)

# 查询单个

class Book(APIView):
# 查询单个方法
def get(self,request, id):
response = {'status':100,'msg':'成功'}
book = models.Book.objects.filter(pk=id).first()
book_ser = BookSerializer(book,many=False)
response['book'] = book_ser.data
return Response(response)

二、局部和全局钩子源码流程

 #为书名增加自定义需求
title = serializers.CharField(max_length=6,min_length=3,error_messages={'max_length':'太长了'}) #也有局部钩子函数
def validate_title(self,value):
from rest_framework import exceptions
print(value)
if value.startswith('tmd'):
raise exceptions.ValidationError('不能以tmd开头')
return value

三、认证源码分析执行流程

#Request对象的user方法
@property
def user(self):
the authentication classes provided to the request.
if not hasattr(self, '_user'):
with wrap_attributeerrors():
self._authenticate()
return self._user def _authenticate(self):
for authenticator in self.authenticators:
try:
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise
#认证成功,可以返回一个元组,但必须是最后一个验证类才能返回
if user_auth_tuple is not None:
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
return self._not_authenticated()

self.authenticators

   def get_authenticators(self):
return [auth() for auth in self.authentication_classes]

Django drf:序列化增删改查、局部与全局钩子源码流程、认证源码分析、执行流程的更多相关文章

  1. Django ORM 数据库增删改查

    Django ORM 数据库增删改查 增 # 创建.增加数据(推荐) models.UserInfo.objects.create(username=') # 创建.增加数据 dic = {'} mo ...

  2. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  3. day 67 django 之ORM 增删改查基础

    一 操作基础前提准备 1. 新建django 项目 mysite  子项目app01 ,选择好做路径. 2  .2-1在app01 下面models 中引用 模块 from  django.db im ...

  4. Django models 的增删改查

    增 from app01.models import * #create方式一: Author.objects.create(name='Alvin') #create方式二: Author.obje ...

  5. django数据库的增删改查

    正常启动服务安装数据库cmd命令:python manage.py makemigrations 创建用户 在pxm里面会有一个py文件..这就是生成了表结构cmd命令:python manage.p ...

  6. django数据库基本操作-增删改查(tip)-基本

    补充:django外键保存 #外键保存 form_data = Form_Data() project, is_created = Project_Name.objects.get_or_create ...

  7. Python Django ORM基本增删改查

    工程下的urls.py中增加如下: from cmdb import views as cmdb #要把你要操作的项目import进来 urlpatterns = [ url(r'orm', cmdb ...

  8. Django中ORM增删改查

    新建模型 class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max ...

  9. 二、Django学习之增删改查

    增加数据 第一种方式 def index(request): #创建记录方式1 #实例化要添加的记录(对象) student_obj = models.Student( name='dazhuang' ...

随机推荐

  1. AWS 云产品 CloudFront + ELB + EC2 + S3 构建虚拟主机动+静分离站点

    目录 一.架构图 二.实现步骤 2.1.EC2 配置 2.2.ELB 设置 2.2.1.创建目标组 2.2.2.创建负载均衡器 2.3.S3 设置 2.4.CloudFront 分配 2.4.1.创建 ...

  2. Spring 使用下列表

    模型层需要提供数据选项,设置错误信息 关键代码 @NotEmpty(message = "请选择兴趣爱好") private String[] hobbies; 控制器层需要在显示 ...

  3. word模板文档填充数据

    1.切记一定要用Word 97-2003(*.doc)格式的文档另存为 *.xml格式的文件,而不能用 Word 2007(*.docx)格式的word文档转 *.xml,将转成功之后的xml文件放入 ...

  4. 泛微E-cology OA /weaver/ 代码执行漏洞

    泛微E-cology OA /weaver/代码执行漏洞 泛微e-cology OA Beanshell组件远程代码执行 分析文章:https://dwz.cn/bYtnsKwa http://127 ...

  5. 乐字节Java反射之一:反射概念与获取反射源头class

    一.Java反射机制概念 “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”,如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAVA有着一个非常突出 ...

  6. Jmeter plugins 之 Perfmon Metrics Collector(服务器性能监控)

    客户端(Jmeter端) 1.安装plugins manager,然后安装  2.添加listener-(第1步成功后才可看到此功能)  服务端:(要监控的服务器) 1.下载ServerAgent,并 ...

  7. K8S从入门到放弃系列-(9)kubernetes集群之kubelet部署

    摘要: Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命: 1.监视分配给该Node节点的pods 2.挂载pod所需要的volume ...

  8. html5 外链式实现加减乘除

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Can you answer these queries III

    Can you answer these queries III 题目:洛谷 SPOJ [题目描述] 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“0 x y”,把A[x]改 ...

  10. MySQL之mysqldump数据备份还原

    一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理 ...