Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >django drf_mnbkdrf

django drf_mnbkdrf

作者头像
全栈程序员站长
发布于 2022-09-20 13:41:53
发布于 2022-09-20 13:41:53
43100
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

前言

我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer

ModelSerializer

先来看下ModelSerializer的代码结构如下:

可以看到ModelSerializer是继承自Serializer,官方是这么介绍到的

ModelSerializer只是一个常规的Serializer,只是做了以下事情

  • 将自动填充一组默认字段
  • 将自动填充一组默认验证程序
  • 提供了默认的.create().update()实现

我们将之前的Serializer类现在用ModelSerializer来实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex']

默认情况下,所有的模型的字段都将映射到序列化器上相应的字段。 如果你希望在模型序列化器中使用默认字段的一部分,你可以使用fieldsexclude选项来执行此操作

  • fields:需要哪些模型字段
  • exclude:排除哪些模型字段

官方强烈建议你使用fields属性显式的设置要序列化的字段。这样就不太可能因为你修改了模型而无意中暴露了数据。 如果我们需要使用模型的全部字段,则可以将fields属性设置成'__all__'

默认情况下,fields里的字段既参加序列化也参加反序列化,如果我们想某个字段只序列化或反序列化可以定义extra_kwargs字段,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class StudentModelSerializer(serializers.ModelSerializer):
    # classes = ClassesModelSerializer(read_only=True)
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex', 'password']
        extra_kwargs = {
            "password": {
                "write_only": True
            },
           "id": {
               "read_only": False
           }
        }

上面代码如果不写extra_kwargs,那么password默认参加序列化和反序列化,那么密码就会返回给前端了,这里我们定义了extra_kwargs字段,在字段中设置了password只能反序列化,那么用户只能提交密码,而后台不会返回密码给前台 当然,extra_kwargs也可以自定义错误信息,如果业务有需要,可以查看官方文档

指定嵌套序列化

上面我们都是单模型的序列化,但是实际业务中我们不会这么简单,一定会遇到关系模型的序列化,下面我们来讲解关系模型的序列化 首先我们看一下models模型内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name="班级名")

    class Meta:
        db_table = "classes"


class Student(models.Model):

    SEX_CHOICES = (
        (1,'男'),
        (2, '女')
    )

    name = models.CharField(max_length=20, verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
    sex = models.IntegerField(choices=SEX_CHOICES, default=1, verbose_name='性别')
    classes = models.ForeignKey(Classes, on_delete=models.SET_NULL, verbose_name="班级", null=True, related_name='students')
    class Meta:
        db_table = "student"

我们定义了Student学生类,里面定义了一个外键classes关联Classes,一个班级中可以有多个学生,而一个学生只能属于一个班级,典型的一对多的关系,接下来我们看序列化函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ClassesModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classes
        fields = ['id', 'name', 'students']


class StudentModelSerializer(serializers.ModelSerializer):
    classes = ClassesModelSerializer(read_only=True)
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex', 'classes']

我们在StudentModelSerializer中增加了一个额外的字段classes,并将字段设置为只读,一般外键只做序列化,并且在fields列表中添加了该字段。 注意:我们在创建外键模型时,必须在外键中设置related_name,如果没设置,序列化时不会返回关联的外键内容

接下来我们访问http://127.0.0.1:8000/drf/student/,会看到返回的学生表中包含了班级表的内容,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "id": 1,
    "name": "jkc",
    "age": 18,
    "sex": 1,
    "classes": {
        "id": 1,
        "name": "班级1",
        "students": [
            1,
            15,
            18
        ]
    }
},

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/166138.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python测试开发django-rest-framework-88.反序列化
serializers.Serializer可以对modle模型中的字段序列化,并且必须写create和update两个方法。ModelSerializer可以看成是Serializer的一个升级版,功能更强大,更方便。 实际上ModelSerializer类继承了Serializer类
上海-悠悠
2021/02/03
6740
python测试开发django-rest-framework-88.反序列化
rest_framework序列化与反序列化1
自定义序列化的过程,对数据的单查与群查,序列化的过程:ORM操作得到数据,然后将数据序列化成前台可以使用的数据返回给前台。
GH
2019/12/30
9370
Python进阶40-drf框架(二)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2K0
Python进阶40-drf框架(二)
DRF中ModelSerializer的使用
DRF的serializers.Serializer所生成的序列化器是最基本的,它可以为数据库模型类定义,也可以为非数据库模型类的数据定义。一般而言,我们使用序列化器对应的都是Django的数据库模型类。DRF为我们提供了ModelSerializer来方便的对应于一个models.
zy010101
2021/12/10
5150
Django rest Framework入门 三 :序列化与反序列化
笔记中提到的代码repo:https://github.com/yexia553/drf
panzhixiang
2024/10/30
2870
drf框架serializers中ModelSerializer类简化序列化和反序列化操作
https://www.cnblogs.com/pythonywy/p/11455508.html
小小咸鱼YwY
2019/09/11
1.5K0
python测试开发django-65.序列化(ModelSerializer)
serializers.Serializer可以对modle模型中的字段序列化,并且必须写create和update两个方法。ModelSerializer可以看成是Serializer的一个升级版,功能更强大,更方便。 实际上ModelSerializer类继承了Serializer类。
上海-悠悠
2019/09/19
6000
python测试开发django-65.序列化(ModelSerializer)
DRF比Django的认证和权限高在哪里
Django可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF做了高级封装,提供了更简洁的实现方式。我们通过继续学习官网教程来进行了解。
dongfanger
2020/12/22
1.5K0
DRF比Django的认证和权限高在哪里
DRF框架(五)——APIview实现增删改查
目录 用APIview实现的功能 路由 model 序列化文件 view视图 查询全部数据 新增数据 根据pk查询一条数据 根据pk进行修改一条数据 删除一条数据 用APIview实现的功能 """ GET /books/ 提供所有记录 POST /books/ 新增一条记录 GET /books/<pk>/ 提供指定id的记录 PUT /books/<pk>/ 修改指定id的记录 DELETE /books/<pk>/ 删
一写代码就开心
2021/03/02
2.2K0
跟着官方文档学Python——Django Rest framework
这周将会持续更新跟着官方文档学Python系列文章,主要是围绕web框架以及其他后端组件的官方文档展开学习。日拱一卒,让我们开始吧!
才浅Coding攻略
2022/12/12
2.4K0
跟着官方文档学Python——Django Rest framework
测试开发进阶(三十四)
数据库模型图 创建app 根据上面的数据库设计,创建9个app configures debugtalks envs interfaces projects reports testsuits tes
zx钟
2019/11/07
5130
测试开发进阶(三十四)
Django_rest框架电商项目实践项目(一篇文章讲清楚电商项目)项目的创建与基本的配置,所有接口的代码,项目代码已给
做一个电商项目,就是卖不同品牌的电脑,可以根据不同的品牌进行查询,还有对订单的crud,还有用户的会员中心功能模块。还有收货地址模块
一写代码就开心
2022/01/21
2.8K0
Django_rest框架电商项目实践项目(一篇文章讲清楚电商项目)项目的创建与基本的配置,所有接口的代码,项目代码已给
ModelSerializer序列化器实战
注意 如果实际项目中不需要操作数据库可以使用APIView,如果操作数据库那么推荐使用GenericAPIView
HammerZe
2022/05/09
4080
ModelSerializer序列化器实战
DRF框架(四)——序列化器和反序列化器
就是数据和模型类对象之间的转换,数据是前段传过来的数据,转换为模型类对象之后,才可以使用rest框架保存到数据库。将数据查询出来是模型类对象,只有转化为一定的格式,比如json格式之后,才可以返回给前段。
一写代码就开心
2021/03/02
1.1K0
DRF框架(四)——序列化器和反序列化器
python测试开发django-rest-framework-91.ChoiceField选项字段校验
在 model 模型里面有个字段是选项字段, goods_status 可以有2种状态,0是下架,1是出售中,默认
上海-悠悠
2021/02/03
1.4K0
python测试开发django-rest-framework-91.ChoiceField选项字段校验
经历了源码的痛苦,掌握DRF的核心序列化器
导入:from rest_framework.serializers import Serializer
HammerZe
2022/05/09
8580
经历了源码的痛苦,掌握DRF的核心序列化器
python测试开发django-rest-framework-90.唯一字段校验UniqueValidator
接着前面ModelSerializer 反序列化的时候,写入到数据库时,有些字段是唯一的,不能重复写到数据库,如商品code,具有唯一性。
上海-悠悠
2021/02/03
1.4K0
python测试开发django-rest-framework-90.唯一字段校验UniqueValidator
测试开发进阶(二十六)
如果在创建序列化器对象时候,只给data传参,那么调用save()方法实际调用的就是序列化器对象的 create()方法 在创建序列化器对象时,同时给instance和data传参,那么调用save()方法实际调用的就是序列化器对象的 update()方法
zx钟
2019/10/17
4610
day91-day92-DjangoRestFrameWork序列化&反序列化的使用
2.2.1 from rest_framework import serializers
少年包青菜
2020/03/02
1K0
Python进阶43-drf框架(五)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
3.2K0
Python进阶43-drf框架(五)
相关推荐
python测试开发django-rest-framework-88.反序列化
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档