Django 原生 serializer (序列化)

  1. 导入模块  from django.core.serializers import serialize
  2. 获取 queryset
  3. 对 queryset 进行序列化
  4. 将序列化之后的数据,返回给客户端

首先,设计url, 先只定义GET和POST接口

from django.urls import path

from DrfOne import views

urlpatterns = [
path('books/', views.BookView.as_view()),
]

再定义几个models

 from django.db import models

 class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField("出版社名", max_length=32)
address = models.CharField("出版社位置", max_length=32)
email = models.EmailField("邮箱") def __str__(self):
return self.name class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField("姓名", max_length=31)
age = models.IntegerField("年龄") def __str__(self):
return self.name class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField("书名", max_length=32)
price = models.DecimalField("价格", max_digits=5, decimal_places=2)
publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE)
authors = models.ManyToManyField(to="Author") def __str__(self):
return self.title

models.py

使用

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
# 1.导入模块
from django.core.serializers import serialize class CourseView(APIView):
def get(self, request):
# 2.获取queryset
course_obj = models.Course.objects.all()
# 3.序列化
serialized_data = serialize("json", course_obj)
print(serialized_data)
# 4.将序列化之后的数据返回
return HttpResponse(serialized_data)

序列化组件serializer的使用

Serializer

GET接口设计(获取所有数据)

  1. 导入模块
  2. 建立一个序列化类
  3. 获取 queryset
  4. 开始序列化
  5. 获取序列化后的数据,返回给客户端
from rest_framework.views import APIView
# 1.导入模块
from rest_framework import serializers
# drf重新封装之后的Response基于TemplateResponse类型,
# 可以将未处理的内容通过内容协商来决定返回给客户端的正确内容形式
from rest_framework.response import Response from DrfOne import models # 2.创建一个序列化类,字段类型不一定要跟models的字段一样
class BookSerializer(serializers.Serializer):
# id一般情况不用写
# nid = serializers.CharField(max_length=32)
title = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
# 外键字段,显示__str__方法的返回值
publish = serializers.CharField() # 多对多字段, 执行get_字段名 方法,手动获取数据
author_list = serializers.SerializerMethodField() def get_author_list(self, book_obj):
# 第二个参数随意
author_list = list()
for author in book_obj.authors.all():
author_list.append(author.name)
return author_list class BookView1(APIView):
def get(self, request):
# 3.获取queryset
book_objs = models.Book.objects.all()
# 4.通过序列化类进行序列化
serialized_obj = BookSerializer(book_objs, many=True)
# print(serialized_obj) # 5.获取序列化之后的数据,返回给客户端
return Response(serialized_obj.data)

POST接口设计

  1. 导入模块
  2. 建立一个序列化类
  3. 获取客户端请求数据
  4. 开始序列化
  5. 写入数据库
  6. 将插入的对象返回给客户端

请注意,因为多对多关系字段是我们自定义的,而且必须这样定义,返回的数据才有意义,而用户插入数据的时候,serializers.Serializer没有实现create,我们必须手动插入数据,就像这样:

# 1.导入模块
from rest_framework import serializers
from rest_framework.views import APIView
# drf重新封装之后的Response基于TemplateResponse类型,
# 可以将未处理的内容通过内容协商来决定返回给客户端的正确内容形式
from rest_framework.response import Response from DrfOne import models # 2.创建一个序列化类,字段名和字段类型不一定要跟models的字段一样
class BookSerializer(serializers.Serializer):
# id一般情况不用写
# nid = serializers.CharField(max_length=32)
title = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
# 外键字段,显示__str__方法的返回值
publish = serializers.CharField()
# 仅读字段read_only=True,source是该字段显示出版社地址
publish_address = serializers.CharField(max_length=32, read_only=True, source="publish.address")
publish_email = serializers.CharField(max_length=32, read_only=True, source="publish.email") # 多对多字段, 执行get_字段名 方法,手动获取数据
author_list = serializers.SerializerMethodField() def get_author_list(self, book_obj):
# 第二个参数随意
author_list = list()
for author in book_obj.authors.all():
author_list.append(author.name)
return author_list def create(self, validated_data):
# 创建时调用
validated_data['publish_id'] = validated_data.pop('publish')
book = models.Book.objects.create(**validated_data)
return book def update(self, instance, validated_data):
# 更新数据会调用该方法
instance.title = validated_data.get('title', instance.title)
instance.publishDate = validated_data.get('publishDate', instance.publishDate)
instance.price = validated_data.get('price', instance.price)
instance.publish_id = validated_data.get('publish', instance.publish.nid) instance.save() return instance class BookView(APIView):
def get(self, request):
pass def post(self, request):
# 3.获取客户端的数据
client_data = request.data
# 4.序列化,默认many=False单条数据
verified_data = BookSerializer(data=client_data)
# 对数据进行验证
if verified_data.is_valid():
# 5.写入数据库
book = verified_data.save()
authors = models.Author.objects.filter(nid__in=request.data["authors"])
book.authors.add(*authors)
# 6.将插入的对象数据返回
return Response(verified_data.data)
# 验证失败返回错误信息
return Response(verified_data.errors)

从上面可以看出:

  1.  serializers.Serializer 无法插入数据,只能自己实现。
  2. 字段太多,不能自动序列化

这样就会非常复杂化程序,如果我希望序列化类自动插入数据呢?

这也就有了 ModelSerializer

ModelSerializer

ModelSerializer  类似于form组件里的 ModelForm

from rest_framework import serializers
from rest_framework.views import APIView class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = "__all__" extra_kwargs = {
# 仅写
"publish": {'write_only': True},
"authors": {'write_only': True},
} publish_name = serializers.CharField(max_length=32, read_only=True, source="publish.name")
publish_address = serializers.CharField(max_length=32, read_only=True, source="publish.address")
author_name = serializers.SerializerMethodField() def get_author_name(self, book_obj):
author_list = list()
for author in book_obj.authors.all():
# 注意列表添加字段,author.name而不是author
author_list.append(author.name)
return author_list

这样看起来简单多了!

get(单条数据)、put(改)、delete(删) 接口设计

设计url

from django.urls import path, re_path

from DrfOne import views

urlpatterns = [
path('books/', views.BookView.as_view()),
re_path("books/(\d+)/", views.BookFilterView.as_view()),
]

视图设计

class BookFilterView(APIView):
def get(self, request, nid):
# 获取queryset
book_obj = models.Book.objects.get(pk=nid)
# 序列化
serialized_data = BookSerializer(book_obj)
# 返回数据
return Response(serialized_data.data) def put(self, request, nid):
# 获取queryset
book_obj = models.Book.objects.get(pk=nid)
# 序列化, 根据instance是确认是否是更新, many默认为False可以不写
verified_data = BookSerializer(data=request.data, instance=book_obj, many=False)
if verified_data.is_valid():
verified_data.save()
# 返回数据
return Response(verified_data.data)
return Response(verified_data.errors) def delete(self, request, nid):
models.Book.objects.get(pk=nid).delete() return Response("")

~>.<~

DRF Django REST framework 之 序列化(三)的更多相关文章

  1. 轻轻松松学会 DRF Django REST framework

    据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...

  2. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  3. DRF Django REST framework APIView(一)

    什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...

  4. Django REST Framework的序列化器是什么?

    # 转载请留言联系 用Django开发RESTful风格的API存在着很多重复的步骤.详细可见:https://www.cnblogs.com/chichung/p/9933861.html 过程往往 ...

  5. DRF Django REST framework 之 解析器(二)

    引入 Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据 ...

  6. Django rest framework之序列化小结

       最近在DRF的序列化上踩过了不少坑,特此结合官方文档记录下,方便日后查阅. [01]前言    serializers是什么?官网是这样的”Serializers allow complex d ...

  7. django rest framework serializers序列化

    serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用: - 将queryset与model实例等进行序列化,转化成json格式,返回给用户(a ...

  8. Django Rest Framework(2)-----序列化详解(serializers)

    REST framework中的序列化类与Django的Form和ModelForm类非常相似.我们提供了一个Serializer类,它提供了一种强大的通用方法来控制响应的输出,以及一个ModelSe ...

  9. DRF (Django REST framework) 中的视图类

    视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...

随机推荐

  1. SpringBoot之ActiveMQ实现延迟消息

    一.安装activeMQ ​ 安装步骤参照网上教程,本文不做介绍 二.修改activeMQ配置文件 ​ broker新增配置信息 schedulerSupport="true" & ...

  2. CSS(4)---三大特性(继承性,层叠性,优先级)

    CSS(4)---三大特性(继承性,层叠性,优先级) CSS有三大特性分别是: 继承性,层叠性,优先级. 一.继承性 概念 给父元素设置一些属性,子元素也可以使用,这个我们就称之为继承性. 注意 1. ...

  3. java jar包在dos框运行步骤演练

    1.选择需要打包的   java project 2.右击,    选择export点击 , 3 选择java选项中的jar file选项 , 点击下一步 4 确认你需要的打包的项目, 点击下一步 5 ...

  4. Java面向对象程序设计第15章5

    5. 利用URLConnetction对象编写程序返回某网站的首页,并将首页的内容存放到文件当中. import java.net.*; import java.io.*; public class ...

  5. JMeter的安装部署——Linux系统

    1.配置Java环境 在官网https://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html下 ...

  6. Hbase简介以及简单的入门操作

    Hbase是一个分布式的.面向列的开源数据库,可实时的读写.随机访问超大规模的数据集. Hbase主要分为两种模型: 逻辑模型和物理模型 1. 逻辑模型 Hbase的名字的来源是Hadoop data ...

  7. Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)

    1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...

  8. hdu 1171 Big Event in HDU (01背包, 母函数)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  10. JS如何在不给新空间的情况下给数组去重?

    1.先排序,在让相邻元素对比去重 const nums = [3, 1, 1, 5, 2, 3, 4, 3, 5, 5, 6, 4, 6, 6, 6]; Array.prototype.arrayNo ...