文章目录

  • 一、Django drf 序列化
    • 1. 背景
    • 2. 使用思路
    • 3. 代码demo
    • 4. 【重要】序列化类 ModelSerializer
    • 5. DRF序列化器to_representation()和to_internal_value()方法
      • to_representation如何使用
      • 示例:例如处理返回的日期格式
  • 二、参考

一、Django drf 序列化

1. 背景

在Django中,前端传来的数据,一般是JSON格式的数据,获取数据需要通过request.POST.get('xxx)的形式拿到数据,对数据操作完后,返回给前端,也需要转成JSON格式,比较麻烦。

不使用 Serializer 序列化会比较繁琐。drf中提供了序列化器的功能,解决了这一过程。过程:通过ORM从数据库获取数据对象–>调用序列化器,序列化数据–>将序列化的数据返回给前端.

功能
  序列化:把模型对象转为字典,经过response后转成JSON字符串
  反序列化:把客户端传来的数据,经过request后转为字典。并完成数据校验功能。序列化器可以把字典转为模型对象。

2. 使用思路

Django DRF 序列化类
参考URL: https://blog.csdn.net/m0_58987515/article/details/125285865

序列化中有2种序列化,一种为 serializers.Serializer 。另一种在 第一个基础下 在次封装 serializers.ModelSerializer

  1. 在应用下新建任意名字文件例如 serializer.py 文件
  2. 定义一个Serializer类型的序列化器继承 serializers.Serializer 类 或 serializers.ModelSerializer 类。
Serializer 的构造方法为:
Serializer(instance=None, data=empty, **kwarg)

1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据例如
serializer = AccountSerializer(account, context={‘request’: request})

注意点:

  • 使用序列化器的时候需要注意,声明序列化器后,不会自动执行,需要在视图中调用才可以。
  • 序列化器无法直接接收数据,需要我们在视图中创建序列化器对象时把使用的数据传递过来。
  • 序列化器的字段声明类似于表单系统。
  • 开发 restful api 时,序列化器会帮我们把模型数据转换成字典.
  • drf 提供的视图会帮我们把字典转换成 json,或者把客户端发送过来的数据转换字典.

3. 代码demo

from rest_framework.views import APIView
from api import models
from api import ser
from rest_framework.response import Responseclass BoosView(APIView):def get(self,request,pk):# 根据pk拿数据book_queryset = models.Books.objects.filter(id=pk).first()# 调用序列化组件,序列化数据book_ser = ser.BookSerializer(book_queryset)# 序列化对象.data就是序列化后的字典return Response(book_ser.data)

4. 【重要】序列化类 ModelSerializer

官网:https://www.django-rest-framework.org/api-guide/serializers/

工作中会发现大部分的序列化都与我们的模型紧密相关。

如果使用序列化器对应 Django 的模型类,DRF为我们提供了 ModelSerializer 模型类序列化器来帮助我们快速创建一个 Serializer 类。 它会根据模型自动生成一组字段;它简单的默认实现了.update()以及.create()方法。总体来说 serializers.ModelSerializer 还是比较好用,写起来方便很多。

ModelSerializer 与常规的 Serializer 相同,但提供了:

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为 Serializer 生成 validators,比如 unique_together
  • 包含默认的 create() 和 update() 的实现
from rest_framework import serializers
from .models import MyBookclass BookSerializer(serializers.ModelSerializer):class Meta:model = MyBookfields = '__all__'
  • 该序列化类需要继承 serializers.ModelSerializer
  • model 指明参照哪个模型类,例如示例中的指定的模型表,可以理解为将模型表中的字段映射成类似于 title = serializers.CharField(max_length=32)
  • fields 指明为模型类的哪些字段生成,'all’用于表示全部字段,也可以指定字段:fields = [‘title’, ‘price’]。还可以排除字段: exclude [‘title’]

5. DRF序列化器to_representation()和to_internal_value()方法

DRF所有序列化器类都继承了BaseSerializer 类, 通过重写该类的 to_representation() 和**to_internal_value()**方法可以改变序列化和反序列化的行为,比如给序列化后的数据添加额外的数据,或者对客户端API请求携带的数据进行反序列化处理以及用来自定义序列化器字段。

  • to_representation() 允许我们改变序列化的输出。
  • to_internal_value() 允许改变我们反序列化的输出。

重写 to_representation() 和to_internal_value()方法不仅可以改变序列化数据的输出,处理反序列化的输入数据,还可以用来自定义字段。

to_representation() 和to_internal_value()方法的另一个重要用途就是用来自定义序列化类字段。下例为DRF提供的一个官方演示,展示了如何使用这两个方法自定义了一个包含有x, y坐标的字段CoordinateField字段。

# 自定义字段
class CoordinateField(serializers.Field):def to_representation(self, value):ret = {"x": value.x_coordinate,"y": value.y_coordinate}return retdef to_internal_value(self, data):ret = {"x_coordinate": data["x"],"y_coordinate": data["y"],}return ret# 定义好后,可以在序列化类中使用。
class DataPointSerializer(serializers.ModelSerializer):coordinates = CoordinateField(source='*')class Meta:model = DataPointfields = ['label', 'coordinates']

to_representation如何使用

在视图类中,我们指定序列化器类

class UserViewSet(ModelViewSet):queryset = User.objects.filter()serializer_class = UserSerializer

然后我们自定义序列化器类,我们覆写to_representation

class UserSerializer(serializers.ModelSerializer):def to_representation(self, instance):...

示例:例如处理返回的日期格式

class ProductsSerializer(serializers.ModelSerializer):# 项目数据序列化器class Meta:model = Productsfields = '__all__'  # 返回所有字段def to_representation(self, instance):data = super().to_representation(instance)# data['create_time']获取到数据库里存储的时间戳,然后用localtime()函数转换为localtimetime_local = time.localtime(data['create_time'])# 拿到转换后的time_local再用strftime()函数重新格式化时间data['create_time'] = time.strftime("%Y-%m-%d %H:%M:%S", time_local)# 返回处理之后的数据return data

处理之后返回的数据:在这里插入图片描述

二、参考

重写DRF的to_representation和to_internal_value方法有什么用途?
参考URL: https://blog.csdn.net/weixin_42134789/article/details/115191672
Django DRF 序列化类
参考URL: https://blog.csdn.net/m0_58987515/article/details/125285865

Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer相关推荐

  1. 史上最全日期格式枚举类

    废话不多说,直接上大餐 package com.fanhf.javastudy.enumTest;import org.apache.commons.lang3.StringUtils; /*** @ ...

  2. django序列化器嵌套_Django Rest Framework中用于OneToOne字段的序列化程序中的嵌套关​​系

    django序列化器嵌套 The Django Rest Framework (DRF) is one of the effectively written frameworks around Dja ...

  3. 【Django基础】Django快速入门

    本系列为 Django 官方文档学习笔记. 文档地址:https://docs.djangoproject.com/zh-hans/3.2/contents/ 环境:macOS10.13.1 + py ...

  4. ajax调用api改表格数据库,【django基础】django接口 异步ajax请求 导出数据库成excel表(包裹前端后端)...

    py文件: from django.utils.http import urlquote from rest_framework.views import APIView from django.sh ...

  5. Django基础---Form和modelform校验器、同源和跨域问题

    文章目录 Form和modelform Form自动生成登录标签并校验 其他属性 校验器组件 Hook钩子方法 局部钩子和全局钩子 modelform 同源和跨域 简单请求跨域 Form和modelf ...

  6. Django框架(13.Django中的查询集)

    查询集 在使用Django中的模型类查询函数:all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数. 查询集特性 ...

  7. django 学习-13 Django文件上传

    1..vim blog/views.py from django  import  forms from django.http  import HttpResponse   1   2 from d ...

  8. 快速上手Django(六) -Django之Django drf 序列化器Serializer类

    文章目录 快速上手Django(六) -Django之Django drf 序列化器Serializer类 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSeria ...

  9. python开发框架——Django基础知识(十一)

      hello!我是小J,每天一个小知识,一起学python,让技术无限发散. DRF和Web 1. web应用模式 1.1 前后端不分离 1.2 前后端分离 2. 使用Django开发REST接口 ...

最新文章

  1. 中科院团队用算法追上谷歌“量子霸权”:谷歌量子处理器并没有比E级超算快...
  2. SAP QM 含有HUM的检验批做UD时候的不同之处?
  3. docker 主进程 日志_[docker]从一个实例,一窥docker进程管理
  4. python 代码片段6
  5. 如果没准备这些面试题,找工作还是缓一缓吧
  6. 极限编程创始人Ron Jeffries建议开发者放弃敏捷
  7. PHP 图片上传类 缩略图
  8. mui多层tab切换上拉加载的实现
  9. Openfire搭建聊天系统
  10. [Threejs]环境光与HDR贴图
  11. excel小写转大写公式_excel数字小写转大写公式的教程
  12. 版本控制工具svn和git
  13. oracle备份数据exp,oracle数据库备份之exp增量备份
  14. excel表格的绝对引用和相对引用
  15. 2020美团实习试题
  16. Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
  17. R语言系统教程(三):多维数组和矩阵
  18. 2017年9月10日训练日记
  19. class file has wrong version 55.0, should be 52.0
  20. [Android]自定义垂直滚动的广告区

热门文章

  1. windows7安装配置jdk1.8
  2. 基于MVT的医学图像处理平台设计与实现
  3. 第三次人工智能热潮和企业SaaS
  4. openstack 命令行管理十八 - instance管理 (备忘)
  5. 国二计算机考试office准考证
  6. TCP/IP协议,握手,挥手
  7. matlab 不提示warning,matlab 打开后就显示的warning,要怎么解决
  8. 看过来~中国消协权威全新解读:揭秘电商法十大亮点!
  9. HTML列表、表格、表单
  10. 使用sed命令规范化文档