Django rest froamwork-ModelSerializer

文章目录

  • 1 检查ModelSerializer
  • 2 指定要包含的字段
  • 3 指定嵌套序列化
  • 4 显式指定字段
  • 5 指定只读字段
  • 6 其他关键字参数
  • 7 关系字段
  • 8 自定义字段映射
    • `.serializer_field_mapping`
    • `.serializer_related_field`
    • `serializer_url_field`
    • `.serializer_choice_field`

通常,您会想要与Django Model 定义紧密映射的 Serializer 类。

ModelSerializer 类提供了一个快捷方式,使用该快捷方式可以自动创建具有与Model字段对应的字段的 Serializer 类别。

ModelSerializer 类与常规 Serializer 类相同,不同之处在于:

  • 它将根据模型自动为您生成一组字段。

  • 它将自动为序列化程序生成验证器,例如 unique_together 验证器。

  • 它包括.create()和.update()的简单默认实现。

声明ModelSerializer如下所示:

class AccountSerializer(serializers.ModelSerializer):class Meta:model = Accountfields = ['id', 'account_name', 'users', 'created']

默认情况下,类上的所有模型字段都将映射到相应的序列化程序字段。

模型上的任何关系(如外键)都将映射到 PrimaryKeyRelatedField。默认情况下不包括反向关系,除非按照序列化程序关系文档中的指定显式包括反向关系。

1 检查ModelSerializer

序列化程序类生成有用的详细表示字符串,使您能够完全检查其字段的状态。当使用 ModelSerializers 时,这一点尤其有用,因为在ModelSerializers中,您需要确定自动为您创建的字段和验证器集。

要做到这一点,请使用 python manage.py shell 打开 Django shell,然后导入序列化程序类,实例化它,并打印对象表示…

>>> from myapp.serializers import AccountSerializer
>>> serializer = AccountSerializer()
>>> print(repr(serializer))
AccountSerializer():id = IntegerField(label='ID', read_only=True)name = CharField(allow_blank=True, max_length=100, required=False)owner = PrimaryKeyRelatedField(queryset=User.objects.all())

2 指定要包含的字段

如果只希望在模型序列化程序中使用默认字段的子集,可以使用 fields exclude 选项,就像使用 ModelForm 一样。强烈建议您使用 fields 属性显式设置应序列化的所有字段。这将在模型更改时无意中暴露数据的可能性降到最低。

例如:

class AccountSerializer(serializers.ModelSerializer):class Meta:model = Accountfields = ['id', 'account_name', 'users', 'created']

您还可以将 fields 属性设置为特殊值 '__all__',以指示应使用模型中的所有字段。

例如:

class AccountSerializer(serializers.ModelSerializer):class Meta:model = Accountfields = '__all__'

可以用 exclude 属性指定要从序列化程序中排除的字段列表。
例如:

class AccountSerializer(serializers.ModelSerializer):class Meta:model = Accountexclude = ['users']

3 指定嵌套序列化

默认的ModelSerializer将主键用于关系,但也可以使用深度选项轻松生成嵌套表示:

class AccountSerializer(serializers.ModelSerializer):class Meta:model = Accountfields = ['id', 'account_name', 'users', 'created']depth = 1

depth选项应设置为一个整数值,该整数值指示在恢复为平面表示之前应遍历的关系的深度。

如果您想自定义序列化的完成方式,您需要自己定义字段。

4 显式指定字段

您可以向 ModelSerializer 添加额外的字段,或者通过在类上声明字段来覆盖默认字段,就像对 Serializer 类一样。

class AccountSerializer(serializers.ModelSerializer):url = serializers.CharField(source='get_absolute_url', read_only=True)groups = serializers.PrimaryKeyRelatedField(many=True)class Meta:model = Accountfields = ['url', 'groups']

额外字段可以对应于模型上的任何属性或可调用字段。

5 指定只读字段

您可能希望将多个字段指定为只读字段。您可以使用快捷方式Meta选项 read_only_fields,而不是使用 read_only=True 属性显式添加每个字段。

此选项应该是字段名称的列表或元组,声明如下:

class AccountSerializer(serializers.ModelSerializer):class Meta:model = Accountfields = ['id', 'account_name', 'users', 'created']read_only_fields = ['account_name']

默认情况下,editable=False 设置的模型字段和 AutoField 字段将设置为只读,不需要添加到 read_only_fields 选项中。

6 其他关键字参数

还有一个快捷方式允许您使用 extra_kwargs 选项在字段上指定任意附加的关键字参数。与read_only_fields的情况一样,这意味着您不需要在序列化程序上显式声明字段。

此选项是一个字典,将字段名映射到关键字参数的字典。例如:

class CreateUserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['email', 'username', 'password']extra_kwargs = {'password': {'write_only': True}}def create(self, validated_data):user = User(email=validated_data['email'],username=validated_data['username'])user.set_password(validated_data['password'])user.save()return user

请记住,如果字段已经在序列化程序类上显式声明,那么 extra_kwargs 选项将被忽略。

7 关系字段

在序列化模型实例时,可以选择多种不同的方式来表示关系。ModelSerializer 的默认表示形式是使用相关实例的主键。
替代表示法包括使用超链接序列化、序列化完整嵌套表示法或使用自定义表示法序列化。
有关完整的详细信息,请参阅序列化程序关系文档。

8 自定义字段映射

ModelSerializer类还公开了一个API,您可以重写该API,以便在实例化序列化程序时更改自动确定序列化程序字段的方式。

通常,如果ModelSerializer默认情况下不生成所需的字段,则应将它们显式添加到类中,或者仅使用常规Serializer类。但是,在某些情况下,您可能希望创建一个新的基类,该基类定义如何为任何给定的模型创建序列化程序字段。

.serializer_field_mapping

Django模型字段到REST框架序列化程序字段的映射。您可以覆盖此映射以更改应用于每个模型字段的默认序列化程序字段。

.serializer_related_field

此属性应该是序列化程序字段类,默认情况下用于关系字段。

对于 ModelSerializer,这默认为serializers.PrimaryKeyRelatedField

对于 HyperlinkedModelSerializer,这默认为 serializers.HyperlinkedRelatedField

serializer_url_field

应用于序列化程序上任何 url 字段的序列化程序字段类。

默认为 serializers.HyperlinkedIdentityField

.serializer_choice_field

应用于序列化程序上的任何 choice 字段的序列化.
默认为 serializers.ChoiceField

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教3妹学编程-算法题】购买水果需要的最少金币数

3妹:“你不是真正的快乐, 你的笑只是你穿的保护色” 2哥 : 3妹还在唱五月天的歌啊, 你不知道五月天假唱,现在全网都在骂呢。 3妹:知道啊,可是关我什么事,这个歌的确好听啊。 2哥 : 嗯嗯&#xf…

Avaya Aura Device Services 任意文件上传漏洞复现

0x01 产品简介 Avaya Aura Device Services是美国Avaya公司的一个应用软件。提供一个管理 Avaya 端点功能。 0x02 漏洞概述 Avaya Aura Device Services 系统PhoneBackup接口处存在任意文件上传漏洞,攻击者可绕过验证上传任意文件获取服务器权限。 0x03 影响范围…

Python一帮一

在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。 输入格式: 输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别&#xff0…

Qt绘制直线箭头

一.使用QPainter绘制 满足条件: 任意角度直线都可绘制箭头所有箭头同样大小 void MainWindow::paintEvent(QPaintEvent*) {QPainter painter(this); // 创建QPainter对象,并指定绘制目标为当前的widgetQLineF line(50,20,500,500);double distanceFromEnd1 20;qre…

Django之缓存

文章目录 一、什么是缓存二、Django中的6种缓存方式三、Django缓存的配置内存缓存(默认情况下就是缓存到内存中)文件缓存(把缓存数据存储在文件中)数据库缓存(把缓存数据存储在数据库中) 四、Django中的缓存应用(三种粒度)全站缓存(利用Django中间件)视图函数缓存局部缓存 一、…

UVM验证平台加入field_automation机制

(1)uvm_field宏实现field_automation机制 UVM中需要逐字段地对transaction进行某些操作。这就是UVM中的 field_automation机制,使用uvm_field系列宏实现: class my_transaction extends uvm_sequence_item;rand bit[47:0] dmac;rand bit[47:0] smac;ran…

openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复

文章目录 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复146.1 背景信息146.2 前置条件146.3 操作步骤146.4 示例 openGauss学习笔记-146 openGauss 数据库运维-备份与恢复-配置文件的备份与恢复 146.1 背景信息 在openGauss使用过程中&#x…

在编老师拒绝当班主任会怎样

作为一名在编老师,拒绝当班主任会怎样?这个问题其实有很多角度可以回答,因为不同的人可能会有不同的看法和经历。 从学校角度来说,拒绝当班主任可能会被视为缺乏责任感和担当精神。班主任是一个非常重要的职务,需要承担…

LLM微调(二)| 微调LLAMA-2和其他开源LLM的两种简单方法

本文将介绍两种开源工具来微调LLAMA-2。 一、使用autotrain-advanced微调LLAMA-2 AutoTrain是一种无代码工具,用于为自然语言处理(NLP)任务、计算机视觉(CV)任务、语音任务甚至表格任务训练最先进的模型。 1&#xf…

循环队列中的求队列长度公式怎么来的?【数学角度】

循环队列中的队列长度怎么来的? 引入 在一个循环队列中,队列的元素个数可以通过头指针(Front,通常用F表示)和尾指针(Rear,通常用R表示)来计算。假设队列的存储空间大小为n,队列中…

二:C语言-数据类型和变量

二:数据类型和变量 1.数据类型的介绍: ​ 内置数据类型(C语言本身具有的):字符 - char;整型 - int;浮点型 - float;布尔类型 - _Bool ​ 自定义数据类型(自己创建的类…

选择更好的Notes索引附件方式

大家好,才是真的好。 首先介绍最近产品更新消息。在上一周,HCL主要发布了以下几个产品更新:HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能,这一次…

kafka学习笔记--基础知识概述

本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…

【开题报告】基于SpringBoot的农场管理系统的设计与实现

1.选题背景 随着社会经济的发展和人们对食品安全和质量的要求不断提高,农业管理也面临着新的挑战和需求。传统的农场管理方式往往依靠手工记录和经验积累,存在信息不及时、管理效率低下等问题。而基于SpringBoot的农场管理系统的设计与实现,…

国标GB28181设备注册安防监控平台EasyCVR不上线是什么原因?

安防视频监控EasyCVR平台兼容性强,可支持的接入协议众多,包括国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台能将接入的视频…

[头歌Python实验]Python入门之基础语法

目录 第1关:行与缩进 第2关:标识符与保留字 第3关:注释 第4关:输入输出 如果对你有帮助的话,不妨点赞收藏关注评论走一波吧,爱你么么哒吗😘💖💖💖 第1关…

逆向爬虫进阶实战:突破反爬虫机制,实现数据抓取

文章目录 一、引言二、逆向爬虫进阶技巧三、逆向爬虫进阶实战代码片段四、总结与展望好书推荐内容简介作者简介前言节选 一、引言 随着网络技术的发展,网站为了保护自己的数据和资源,纷纷采用了各种反爬虫机制。然而,逆向爬虫技术的出现&…

【Python百宝箱】漫游Python数据可视化宇宙:pyspark、dash、streamlit、matplotlib、seaborn全景式导览

Python数据可视化大比拼:从大数据处理到交互式Web应用 前言 在当今数字时代,数据可视化是解释和传达信息的不可或缺的工具之一。本文将深入探讨Python中流行的数据可视化库,从大数据处理到交互式Web应用,为读者提供全面的了解和…

控乐屋品牌|智汇恒星全宅智能空间万物互联,千亿蓝海蓄势待发

随着5G、大数据、云计算、物联网等技术的发展,智能化正覆盖人们生活的方方面面,全屋智能的出现为“一键式”智能家居生活享受提供无限可能。近年来智能家居行业总体规模增长迅速,数据显示,2022年中国智能家居行业市场规模约为6200…

Redis滚动分页的使用

Feed流 关注推送也叫Feed流。通过无限下拉刷新获取新的信息。 Feed流产品常见有两种模式: Timeline: 不做内容筛选,简单的按照内容发布时间排序,常用于好友或关注。例如朋友圈 优点:信息全面,不会有缺失。并且实现也…