rest_framework序列化之Serializer

步骤:

1.自定义一个类,继承Serializer类;

2.在类中写要序列化的字段;

3.使用:在views.py文件中,book_ser=BookSerializer(book_list,many=True),book_ser.data就是序列化后的数据。当序列化的数据有多条(为QuerySet对象)时设置many=True,当序列化的数据只有一条(为obj对象)时设置many=False。

models部分:

from django.db import models

# Create your models here.

class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish', null=True, on_delete=models.SET_NULL, db_constraint=False)
author = models.ManyToManyField(to='Author', db_constraint=False) class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
address = models.CharField(max_length=16) class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
author_detail = models.OneToOneField(to='AuthorDetail', null=True, on_delete=models.SET_NULL, db_constraint=False) class AuthorDetail(models.Model):
id = models.AutoField(primary_key=True)
age = models.IntegerField()
sex = models.SmallIntegerField(default=0)
info = models.CharField(max_length=128)

views部分:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers from rest_framework import serializers class BookSerializers(serializers.Serializer):
title=serializers.CharField(max_length=32)
price=serializers.IntegerField()
pub_date=serializers.DateField()
publish=serializers.CharField(source="publish.name")
#authors=serializers.CharField(source="authors.all")
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
temp=[]
for author in obj.authors.all():
temp.append(author.name)
return temp
  #此处可以继续用author的Serializers,
  # def get_authors(self,obj):
    # ret=obj.authors.all()
    # ss=AuthorSerializer(ret,many=True)
    # return ss.data class BookViewSet(APIView): def get(self,request,*args,**kwargs):
book_list=Book.objects.all()
# 序列化方式1:
# from django.forms.models import model_to_dict
# import json
# data=[]
# for obj in book_list:
# data.append(model_to_dict(obj))
# print(data)
# return HttpResponse("ok") # 序列化方式2:
# data=serializers.serialize("json",book_list)
# return HttpResponse(data) # 序列化方式3:
bs=BookSerializers(book_list,many=True) #many=True代表有多条数据,如果只有一条数据,many=False
return Response(bs.data)
     # 序列化方式4:
   # ret=models.Book.objects.all().values('nid','title')
     # dd=list(ret)
# return HttpResponse(json.dumps(dd))

注:

1.source指定的如果是字段,则会显示字段,如果是方法,则会执行方法,不用加括号(books=serializers.CharField(source='books.all'));

2.SerializerMethodField,必须配合方法使用  get_字段名(self,obj),obj是当前要序列化的对象;

3.SerializerMethodField对应的方法中还可以继续使用其他的序列化类。

rest_framework序列化之ModelSerializer

步骤:

1.自定义一个类继承ModelSerializer;

2.在类内部写:

class Meta:
model=models.Book
fields='__all__'
# exclude=['name','price']
depth=1
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
# fields = "__all__"
fields=['nid','title','authors','publish']
# exclude=('nid',) #不能跟fields同时用
# depth = 1 #深度控制,写 几 往里拿几层,层数越多,响应越慢,官方建议0--10之间,个人建议最多3层
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
return obj.publish.name
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret=obj.authors.all()
ss=AuthorSerializer(ret,many=True)
return ss.data

请求数据校验和保存:

class BooksView(APIView):
def post(self, request):
response = {'status': 200, 'msg': '修改成功'}
try:
obj_ser = self.BookSerializer(data=request.data)
if obj_ser.is_valid(): # 校验
obj_ser.save() # 生成记录
response['data'] = obj_ser.data
else:
response['msg'] = obj_ser.errors
except Exception as e:
response['msg'] = str(e)
return Response(response)

校验字段局部和全局钩子函数:

class BookSerialzers(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
depth = 1 #局部钩子函数,validate_字段名,value字段的值
def validate_name(self, value):
if re.match('^[0-9]+', value):
raise ValidationError('书名不能以数字开头')
return value #全局钩子函数,对全局字段进行校验
def validate(self,objdict):
name=objdict.get('name')
price=objdict.get('price')
if name != price:
raise ValidationError('错了')
else:
return objdict

drf序列化组件的更多相关文章

  1. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  2. DRF 序列化组件

    Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...

  3. DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验

    序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...

  4. DRF 序列化组件 模型层中参数补充

    一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...

  5. 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)

    知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...

  6. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  7. DRF 序列化组件单增

    目录 自定义序列化(矬) Serializer类(方式繁琐) 底层序列化类 UserSerializer 视图序列化步骤 底层反序列化类 UserCreatSerializer 视图反序列化步骤 Mo ...

  8. drf序列化组件之视图家族

    一.视图家族的分类 1.导入分类 from rest_framewok import views, generics, mixins, viewsets views:视图类 ​ 两大视图类:APIVi ...

  9. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

随机推荐

  1. Vue(小案例_vue+axios仿手机app)_公共组件(路由组件传参)

    一.前言                    1.公共轮播图的实现                    2.组件传参,公共组件的实现 二.主要内容 1.公共轮播图的实现 (1)分析:当渲染不同的轮 ...

  2. centos7启动网卡报错(Failed to start LSB: Bring up/down networking )

    systemctl status network.service systemctl stop NetworkManager systemctl disable NetworkManager syst ...

  3. webserver Etcd Cluster / CoreOS etcd / macOS etcd

    s https://coreos.com/etcd/ https://coreos.com/etcd/docs/latest/ macOS mojave etcd 003deMac-mini:~ ma ...

  4. django - 总结 - redis缓存

    八.redis 补充- 操作 - 增删改查 对字典,重新设计结构,增删改查. hmset  keys  hget   scan_iter  hgetall  import redis import j ...

  5. 【转载】c++中浅复制与深复制

    https://www.cnblogs.com/xiaodingmu/p/7407307.html

  6. MySQL关于日志配置安全整改及处理方法

    [环境介绍] 系统环境:Linux + mysql 5.7.18 + 主从复制架构 [背景描述] 需求:MySQL数据库都有每年的集团安全整改,常常要求弱口令扫描,基线扫描,漏洞扫描等等.对于MySQ ...

  7. SSRF漏洞挖掘经验

    SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问 ...

  8. H5——while循环,for循环

    [循环结构的步骤] * ① 声明循环变量 * ② 判断循环条件 * ③ 执行循环体(while的{}中的所有代码) * ④ 更改循环变量 * 然后执行② ③ ④   var n=1; // ① 声明循 ...

  9. SrpingBoot部署到云服务器

    预先准备事项 1.本地主机:安装maven 2.云端主机:安装和配置jdk 一.maven打包 方式一:maven手动版 切换至项目下,cmd:mvn package 查看target目录: 方式二: ...

  10. ES7 and ES8 特性

    ES7 特性:1.Array.prototype.includes let arr = ['react', 'angular', 'vue'] // Correct if (arr.includes( ...