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

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

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

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

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

注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料,将在公众号CTO Plus发布,欢迎关注我公众号:CTO Plus

关于Articulate“做一个知识和技术的搬运工。做一个终身学习的爱好者。做一个有深度和广度的技术圈。”一直以来都想把专业领域的技https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q 

 

在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 Album

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)
    class Meta:
        model = Album
        fields = ('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 = Album
        fields = ('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 = Album
        fields = ('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 = Album
        fields = ('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 = Album
        fields = ('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 = Track
        fields = ('order', 'title', 'duration')

class AlbumSerializer6(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('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 = Track
        fields = ('order', 'title', 'duration')

class AlbumSerializer7(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True)

    class Meta:
        model = Album
        fields = ['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
 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本季课程把开发知识拆解到项目里,让你在项目情境里学知识。这样的学习方式能让你保持兴趣、充满动力,时刻知道学的东西能用在哪、能怎么用。平时不明白的知识点,放在项目里去理解就恍然大悟了。  一、融汇贯通本视频采用了前后端分离的开发模式,前端使用Vue.js+Element UI实现了Web页面的呈现,后端使用PythonDjango REST Framework框架实现了数据访问的接口,前端通过Axios访问后端接口获得数据。在学习完本章节后,真正理解前后端的各自承担的工作。 二、贴近实战本课程为学生信息管理系统课程:Vue3 + Vite + ElementPlus + Django REST Framework项目实战 本季课程主学生信息管理系统V5.0,内容包含:Django REST framework安装和项目初始化、数据的序列化、ViewSet视图集、DefaultRouter路由类、django-filter实现过滤、rest framework实现查找、rest framework实现分页、npm的使用、使用Vite构建vue3项目、Package.json解析、ElementPlus安装和应用、vue-router实现路由、使用Vuex的store对象、后台管理系统主界面的布局、axios组件的安装和请求、axios请求的模块化、请求拦截器和响应拦截器、使用el-select实现联级下拉、使用cascader实现联级选择、vue表单的验证、实现学生信息的添加、修改和删除、实现文件的上传等等功能 本案例完整的演示了项目实现过程,虽然不复杂,但涉及的内容非常多,特别是前后端交互的时候,有诸多的坑等着你去踩,好在王老师全程代码呈现,带着大家一起填坑,大大提高学习效率的同时,也培养了大家良好的代码习惯,希望大家一起跟着王进老师学习Python开发。三、后续课程预告:Vue和Django REST Framework实现JWT登录认证 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值