ModelSerializer序列化与反序列化(重点)

2023-11-05

视图类

class UserV3APIView(APIView):
    # 单查群查
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:
            user_obj = models.User.objects.filter(is_delete=False, pk=pk).first()
            if not user_obj:
                return Response({
                    'status': 1,
                    'msg': 'pk error',
                }, status=400)

            user_ser = serializers.UserModelSerializer(user_obj, many=False)
            return Response({
                'status': 0,
                'msg': 'ok',
                'results': user_ser.data
            })
        else:
            user_query = models.User.objects.filter(is_delete=False).all()

            user_ser = serializers.UserModelSerializer(user_query, many=True)

            return Response({
                'status': 0,
                'msg': 'ok',
                'results': user_ser.data
            })

    # 单增
    def post(self, request, *args, **kwargs):
        user_ser = serializers.UserModelSerializer(data=request.data)
        if user_ser.is_valid():
            # 入库
            user_obj = user_ser.save()
            return Response({
                'status': 0,
                'msg': 'ok',
                'results': serializers.UserModelSerializer(user_obj).data
            })
        else:
            return Response({
                'status': 1,
                'msg': user_ser.errors,
            })

序列化类

""" ModelSerializer类序列化与反序列化总结
1)序列化类继承ModelSerializer,所以需要在配置类Meta中进行配置
2)model配置:绑定序列化相关的Model表
3)fields配置:采用 插拔式 设置所有参与序列化与反序列化字段
4)extra_kwargs配置:
    划分系统字段为三种:只读(read_only)、只写(write_only)、可读可写(不设置)
    字段是否必须:required
    选填字段:在extra_kwargs进行配置,但不设置required,且有默认值
5)自定义序列化字段:
    第一种(不提倡):在序列化类中用SerializerMethodField()来实现
    第二种(提倡):在模型类中用@property来实现,可插拔
6)自定义反序列化字段:
    同Serializer类,且规则只能在此声明中设置,或是在钩子中设置,在extra_kwargs中对其设置的无效
    自定义反序列化字段与系统字段,设置规则一样,所以必须设置 write_only
7)局部钩子,全局钩子同Serializer类
8)不需要重写create和update方法
"""
class UserModelSerializer(serializers.ModelSerializer):
    # 第一种自定义序列化字段:该字段必须在fields中设置
    # gender = serializers.SerializerMethodField()
    # def get_gender(self, obj):
    #     return obj.get_sex_display()


    # 自定义反序列化字段同Serializer类,且规则只能在此声明中设置,或是在钩子中设置,
    #       在extra_kwargs中对其设置的无效
    # 注:自定义反序列化字段与系统字段,设置规则一样,所以必须设置 write_only
    re_password = serializers.CharField(min_length=3, max_length=16, write_only=True)

    class Meta:
        model = models.User
        # fields采用 插拔式 设置所有参与序列化与反序列化字段
        fields = ('username', 'gender', 'icon', 'password', 'sex', 're_password')
        extra_kwargs = {
            'username': {  # 系统字段不设置read_only和write_only,默认都参加
                'min_length': 3,
                'max_length': 10,
                'error_messages': {
                    'min_length': '太短',
                    'max_length': '太长'
                }
            },
            'gender': {
                'read_only': True,  # 自定义的序列化字段默认就是read_only,且不能修改,可以省略
            },
            'password': {
                'write_only': True,
            },
            'sex': {  # 像sex有默认值的字段,为选填字段('required': True可以将其变为必填字段)
                'write_only': True,
                # 'required': True
            }
        }


    # 局部全局钩子同Serializer类,是与 Meta 同缩进的
    def validate_username(self, value):
        if 'g' in value.lower():
            raise serializers.ValidationError('名字中不能有g')
        return value

    def validate(self, attrs):
        password = attrs.get('password')
        re_password = attrs.pop('re_password')
        if password != re_password:
            raise serializers.ValidationError({'re_password': '两次密码不一致'})
        return attrs

    # create和update方法不需要再重写,ModelSerializer类已提供,且支持所有关系下的连表操作

模型类

from django.db import models

class User(models.Model):
    SEX_CHOICES = (
        (0, '女'),
        (1, '男'),
    )

    username = models.CharField(max_length=64, verbose_name='用户名', blank=True, unique=True)
    password = models.CharField(max_length=64, verbose_name='密码')
    sex = models.IntegerField(choices=SEX_CHOICES, default=0, verbose_name='性别')
    img = models.ImageField(upload_to='img', default='img/default.png', verbose_name='头像')
    # 开发中,数据不会直接删除,通过字段控制
    is_delete = models.BooleanField(default=False, verbose_name='是否注销')
    # 数据库数据入库,一般都会记录该数据第一次入库时间,有时候还会记录最后一次更新时间
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    # 第二种自定义序列化字段(插拔式,提倡使用)
    @property
    def gender(self):
        return self.get_sex_display()

    @property
    def icon(self):
        from django.conf import settings
        return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)


    class Meta:  # 配置类,给所属类提供配置信息
        db_table = 'old_boy_user'
        verbose_name_plural = '用户表'

    def __str__(self):  # 不要在这里进行连表操作,比如admin页面可能会崩溃
        return self.username
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ModelSerializer序列化与反序列化(重点) 的相关文章

随机推荐

  • (Java)leetcode-113 Path Sum II(路径总和 II)

    题目描述 给定一个二叉树和一个目标和 找到所有从根节点到叶子节点路径总和等于给定目标和的路径 说明 叶子节点是指没有子节点的节点 示例 给定如下二叉树 以及目标和 sum 22 5 4 8 11 13 4 7 2 5 1 返回 5 4 11
  • Pytorch 基于经典模型LeNet-5训练MNIST数据集手写数字

    LeNet 5简介 LeNet 5官网链接 卷积神经网络是一种特殊的多层神经网络 与几乎所有其他神经网络一样 它们使用反向传播算法版本进行训练 它们的不同之处在于架构 卷积神经网络旨在通过最少的预处理直接从像素图像中识别视觉模式 他们可以识
  • node + selenium-webdriver 进行Web自动化测试

    1 环境安装 nodejs安装 webdriver安装 安装各浏览器的驱动 通过各浏览器的驱动程序 操作浏览器 chrome 驱动安装 每个版本的浏览器用到的webdriver不同 可以通过chrome右上角 gt 帮助 gt 关于 Chr
  • 定义和声明的区别

    对于变量来说 定义就是声明 例如 int a 我们可是说它是定义也可以说它是声明 但是对于函数来说定义和声明完全不是一回事 void sum int a int b 这是函数的声明 void sum int a int b 整体是函数的定义
  • 纯代码的3D玫瑰花,有个这个还怕女朋友不开心?

    先上效果图 再上代码
  • 【hortonworks/registries】Parameter Schema name is null

    1 背景 修改了hortonworks registries的0 9版本的源码后 加入了json格式 然后部署后 添加schema的时候报错如下 INFO 2020 08 18 07 04 18 802 com hortonworks
  • es6之对象的扩展

    function getPoint const x 1 const y 10 return x y getPoint x 1 y 10 CommonJS 模块输出一组变量 就非常合适使用简洁写法 let ms function getIte
  • 【Metashape精品教程4】软件设置

    Metashape精品教程4 软件设置 文章目录 Metashape精品教程4 软件设置 前言 一 一般 二 GPU 三 网络 四 Appearance 五 高级 六 Agisoft Metashape1 8专业版用户手册 前言 Metas
  • C - 一只小蜜蜂...

    有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房 不能反向爬行 请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数 其中 蜂房的结构如下所示 Input 输入数据的第一行是一个整数N 表示测试实例的个数 然后是N 行数据 每行包含两个整数a和b 0
  • Java UnknownHostException –服务器的无效主机名–如何解决?

    An UnknownHostException的快速指南 如果在为远程方法调用创建到远程主机的连接时发生java net UnknownHostException 则会抛出该快速指南 UnknownHostException的预防方法 1
  • cookie 和session 的区别详解

    原文地址 http www cnblogs com shiyangxt archive 2008 10 07 1305506 html 这些都是基础知识 不过有必要做深入了解 先简单介绍一下 二者的定义 当你在浏览网站的时候 WEB 服务器
  • 用Python进行面向对象编程:提高代码可重用性和扩展性

    数据来源 01 初识对象 生活中数据的组织 程序中数据的组织 使用对象组织数据 演示 演示使用对象组织数据 在程序中设计表格 我们称之为 设计类 class class Student name None 记录学生姓名 gender Non
  • [4G+5G专题-132]: 传输层 - 以太网电缆的类型(Cat5,Cat5e,Cat6,Cat6a)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121552941 目录 1 主要的技术
  • BUUCTF Misc 二维码 & 你jing然赶我走 & 大白 & N种方法解决 & 乌镇峰会种图1 & 基础po解

    目录 二维码 你竟然赶我走 大白 N种方法解决 乌镇峰会种图 基础po解 二维码 下载文件 一个二维码 使用 QR research扫描 扫描完提示flag就在这 把二维码拖入010 editor打开 有个txt文档 使用kali中的bin
  • win7安装vmtools

    打开该虚拟机的虚拟机设置 选择软盘 设备状态设置为启动时连接 连接选择使用物理驱动器并使用自动检测 如图所示 然后保存并退出设置 在虚拟机选项中就可以选择安装vmtools了 或者在该虚拟机中选择软盘进行安装
  • 一周简报(维护项目空间)

    这一周 是9月的第三周了 我依然战斗在XX海油上 本周我的主要任务是处理项目空间中的一个需求变更 顾客就是上帝 对于他们合理的需求 我们努力去做到尽善尽美 当然也要保证在客户要求的时间内去完成 在这个高节奏 快步伐的时代 效率和质量是大家追
  • Unity 游戏框架搭建 2019 (四十六) 简易消息机制

    在上一篇 我们接触了单例 使用单例解决了我们脚本之间访问的问题 脚本之间访问其实有更好的方式 我们先分下脚本访问脚本的几种形式 第一种 A GameObject 是 B GameObject 的 Parent 或者是中间隔着几个层级的 Pa
  • 蓝桥杯-高精度阶乘(Java代码)

    问题描述 输入一个正整数n 输出n 的值 其中n 123 n 算法描述 n 可能很大 而计算机能表示的整数范围有限 需要使用高精度计算的方法 使用一个数组A来表示一个大整数a A 0 表示a的个位 A 1 表示a的十位 依次类推 将a乘以一
  • 昆仑天工AIGC——基于Stable Diffusion的多语言AI作画大模型测评

    文章目录 1 AIGC 2 技术背景 2 1 Stable Diffusion 2 1 1 图像感知压缩 Perceptual Image Compression 2 1 2 隐扩散模型 Latent Diffusion Models 2
  • ModelSerializer序列化与反序列化(重点)

    视图类 class UserV3APIView APIView 单查群查 def get self request args kwargs pk kwargs get pk if pk user obj models User object