12、DRF实战总结:DRF序列化模型与序列化关系模型详解(附源码)

news/2025/2/14 2:07:17/

序列化模型与序列化关系模型

序列化模型是将Python对象转换为可储存或传输的格式,如JSON或XML。序列化模型可以用于数据储存、数据传输和数据共享等方面,可以有效地提高数据传输效率和数据共享效率。

序列化关系模型是在序列化模型的基础上,将关联的对象序列化为引用,简化了数据结构。序列化关系模型可以用于处理大量嵌套数据和减少数据传输量。

序列化模型,即对 models 里的数据模型做序列化。而序列化关系模型则是对 models 里数据模型中带有关系的如 ForeignKey, ManyToManyFieldOneToOneField 字段作序列化。Django Rest Framework 提供了灵活的序列化关系模型,让开发者可以自由定制序列化数据模型。

在DRF中,关系模型包括:

1. ForeignKey 关联模型。

2. ManyToManyField 多对多关联模型。

3. OneToOneField 一对一关联模型。

4. RelatedField 自定义模型关联模型。

5. HyperlinkedRelatedField 基于超链接的模型关联模型。

通过这些关系模型,可以很方便地处理不同模型间的关联,并在序列化时自动包含关联的数据。

前面见过DRF Serializer的详细使用方法,包括数据验证重写序列化器,详细参考:4、DRF实战总结:序列化器(Serializer)、数据验证、重写序列化器方法详解(附源码)

序列化关系模型

根据官方的例子来看一下每一个关系模型的介绍。

数据模型如下:

class Album(models.Model):album_name = models.CharField(max_length=100)artist = models.CharField(max_length=100)class Track(models.Model):album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)order = models.IntegerField()title = models.CharField(max_length=100)duration = models.IntegerField()class Meta:unique_together = ('album', 'order')ordering = ['order']def __unicode__(self):return f"{self.order}: {self.title}"
 

StringRelatedField

使用 StringRelatedField 将返回一个对应关系 model 的 __unicode__() 方法的字符串。这个字段是只读的。

参数:

  1. many 如果应用于多对多关系,则应将此参数设置为 True

序列化模型如下

from rest_framework import serializers
from .models_serializers import Albumclass AlbumSerializer(serializers.ModelSerializer):tracks = serializers.StringRelatedField(many=True)class Meta:model = Albumfields = ('album_name', 'artist', 'tracks')

序列化结果如下:

{'album_name': 'Things We Lost In The Fire','artist': 'Low','tracks': ['1: Sunflower','2: Whitetail','3: Dinosaur Act',]
}
 

PrimaryKeyRelatedField

使用 PrimaryKeyRelatedField 将返回一个对应关系 model 的主键列表。

参数:

  1. queryset 用于在验证字段输入时模型实例查找。关系必须明确设置 queryset,或设置 read_only = True
  2. many 如果是对应多个的关系,就设置为 True
  3. allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False
  4. pk_field 设置为一个字段以控制主键值的序列化/反序列化。例如,pk_field = UUIDField(format ='hex')将UUID主键序列化为紧凑的十六进制表示。

序列化模型如下

class AlbumSerializer2(serializers.ModelSerializer):tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)class Meta:model = Albumfields = ('album_name', 'artist', 'tracks')

序列化结果如下:

{'album_name': 'Undun','artist': 'The Roots','tracks': [89,90,91,]
}

HyperlinkedRelatedField

使用 HyperlinkedRelatedField 将返回一个超链接,该链接指向对应关系 model 的详细数据,view-name 是必选参数,为对应的视图生成超链接。

参数:

  1. view_name 用作关系目标的视图名称。如果使用的是标准路由器类,那么它的格式为 <modelname>-detail 的字符串
  2. queryset 验证字段输入时用于模型实例查询的查询器。关系必须明确设置 queryset,或设置 read_only = True
  3. many 如果应用于多对多关系,则应将此参数设置为 True
  4. allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False
  5. lookup_field 应该用于查找的目标上的字段。应该对应于引用视图上的 URL 关键字参数。默认值为 pk
  6. lookup_url_kwarg 与查找字段对应的 URL conf 中定义的关键字参数的名称。默认使用与 lookup_field 相同的值
  7. format 如果使用 format 后缀,超链接字段将对目标使用相同的 format 后缀,除非使用 format 参数进行覆盖。

序列化模型如下:

class AlbumSerializer3(serializers.ModelSerializer):tracks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='track-detail')class Meta:model = Albumfields = ('album_name', 'artist', 'tracks')

序列化结果如下:

{'album_name': 'Graceland','artist': 'Paul Simon','tracks': ['http://www.example.com/api/tracks/45/','http://www.example.com/api/tracks/46/','http://www.example.com/api/tracks/47/',]
}
 

SlugRelatedField

使用 SlugRelatedField 将返回一个指定对应关系 model 中的字段,需要参数 slug_field 中指定字段名称。

参数:

  1. slug_field 应该用于表示目标模型的字段。这应该是唯一标识任何给定实例的字段。例如 username 。这是必选参数
  2. queryset 验证字段输入时用于模型实例查询的查询器。关系必须明确设置 queryset,或设置 read_only = True
  3. many 如果应用于多对多关系,则应将此参数设置为 True
  4. allow_null 如果设置为 True,则该字段将接受 None 的值或为空的关系的空字符串。默认为 False

序列化模型如下:

class AlbumSerializer4(serializers.ModelSerializer):tracks = serializers.SlugRelatedField(many=True, read_only=True, slug_field='title')class Meta:model = Albumfields = ('album_name', 'artist', 'tracks')

序列化结果如下:

{'album_name': 'Dear John','artist': 'Loney Dear','tracks': ['Airport Surroundings','Everything Turns to You','I Was Only Going Out',]
}
 

HyperlinkedIdentityField

使用 HyperlinkedIdentityField 将返回指定 view-name 的超链接的字段。

参数:

  1. view_name 应该用作关系目标的视图名称。如果您使用的是标准路由器类,则它将是格式为 <model_name>-detail的字符串。必选参数
  2. lookup_field 应该用于查找的目标上的字段。应该对应于引用视图上的 URL 关键字参数。默认值为 pk
  3. lookup_url_kwarg 与查找字段对应的 URL conf 中定义的关键字参数的名称。默认使用与 lookup_field 相同的值
  4. format 如果使用 format 后缀,超链接字段将对目标使用相同的 format 后缀,除非使用 format 参数进行覆盖

序列化模型如下:

class AlbumSerializer5(serializers.HyperlinkedModelSerializer):track_listing = serializers.HyperlinkedIdentityField(view_name='track-list')class Meta:model = Albumfields = ('album_name', 'artist', 'track_listing')

序列化结果如下:

{'album_name': 'The Eraser','artist': 'Thom Yorke','track_listing': 'http://www.example.com/api/track_list/12/'
}
 

嵌套序列化关系模型

在序列化模型中指定嵌套序列化关系模型将返回一个该嵌套序列化关系模型对应的数据模型中序列化的数据。

参数:

  1. many 如果应用于多对多关系,则应将此参数设置为 True

序列化模型如下:

from .models_serializers import Track
# 在序列化模型中指定嵌套序列化关系模型
class TrackSerializer(serializers.ModelSerializer):class Meta:model = Trackfields = ('order', 'title', 'duration')class AlbumSerializer6(serializers.ModelSerializer):tracks = TrackSerializer(many=True, read_only=True)class Meta:model = Albumfields = ('album_name', 'artist', 'tracks')

序列化结果如下:

{'album_name': 'The Grey Album','artist': 'Danger Mouse','tracks': [{'order': 1,'title': 'Public Service Announcement','duration': 245},{'order': 2,'title': 'What More Can I Say','duration': 264},{'order': 3,'title': 'Encore','duration': 159}]
}
 

使用嵌套序列化器时不设置read_only=True, 需重写主序列化器的create(self, validated_data)方法和update方法。

from .models_serializers import Track
# 在序列化模型中指定嵌套序列化关系模型
class TrackSerializer(serializers.ModelSerializer):class Meta:model = Trackfields = ('order', 'title', 'duration')class AlbumSerializer7(serializers.ModelSerializer):tracks = TrackSerializer(many=True)class Meta:model = Albumfields = ['album_name', 'artist', 'tracks']def create(self, validated_data):tracks_data = validated_data.pop('tracks')album = Album.objects.create(**validated_data)for track_data in tracks_data:Track.objects.create(album=album, **track_data)return album
 

输入才有输出,吸收才能吐纳。——码字不易


http://www.ppmy.cn/news/41305.html

相关文章

NumPy 秘籍中文第二版:二、高级索引和数组概念

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们将介绍以下秘籍&#xff1a; 安装 SciPy安装 PIL调整图像大小比较视图和副本翻转 Lena花式索引位置列表索引布尔值索引数独的步幅技巧广播数…

「Python 机器学习」Pandas 数据分析

Pandas 是一个开源的 Python 库&#xff0c;专为数据处理和分析任务而设计&#xff1b;它提供了高性能、易用的数据结构和数据分析工具&#xff0c;使得在 Python 中进行数据科学变得简单高效&#xff1b;Pandas 基于 NumPy&#xff0c;因此可以与许多其他基于 NumPy 的库&…

Java之二叉搜索树(BST)

目录 一.二叉搜索树(BST) 1.什么是二叉搜索树 2.判断一颗二叉搜索树 二.二叉搜索树CRUD操作 1.二叉搜索树的数据结构 2.添加操作 3.查找操作 1.查找最大值 2.查找最小值 3.查找任意值 4.删除操作 1.删除最大值 2.删除最小值 3.删除任意值 5.其他操作 1.打印操作(…

优漫动游广州哪家培训平面设计做的不错呢?

平面设计的常见用途包括标识&#xff08;商标和品牌&#xff09;、出版物&#xff08;杂志&#xff0c;报纸和书籍&#xff09;、平面广告&#xff0c;海报&#xff0c;广告牌&#xff0c;网站图形元素、标志和产品包装。 ​   Photoshop   通过对本课程的学习能够熟练使…

Elasticsearch:配置选项

Elasticsearch 带有大量的设置和配置&#xff0c;甚至可能让专家工程师感到困惑。 尽管它使用约定优于配置范例并且大部分时间使用默认值&#xff0c;但在将应用程序投入生产之前自定义配置是必不可少的。 在这里&#xff0c;我们将介绍属于不同类别的一些属性&#xff0c;并讨…

详解高斯混合聚类(GMM)算法原理

详解高斯混合聚类(GMM)算法原理 摘要&#xff1a;高斯混合聚类(GMM)是一种聚类算法&#xff0c;可以用来对数据进行分类。GMM算法假设数据点是由一个或多个高斯分布生成的&#xff0c;并通过最大似然估计的方法来估计每个簇的高斯分布的参数。在实际应用中&#xff0c;GMM聚类…

NumPy 基础知识 :1~5

原文&#xff1a;Numpy Essentials 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 一、NumPy 简介 “我宁愿使用通用语言进行数学运算&#xff0c;也不愿尝试使用数学语言进行通用编程。” – John D Cook 在过去的十年中&#xff0c;Python 已成为科学计算中最受欢迎…

spring(七):事务操作

spring&#xff08;七&#xff09;&#xff1a;事务操作前言一、什么是事务二、事务四个特性&#xff08;ACID&#xff09;三、事务操作&#xff08;搭建事务操作环境&#xff09;四、事务操作&#xff08;Spring 事务管理介绍&#xff09;五、事务操作&#xff08;注解声明式事…