【Django学习】(十)模型序列化器_关联字段序列化

news2024/11/25 20:40:58

这篇文章是针对模型类序列化器以及如何关联字段序列化 进行深入讲解的;

class ProjectModelSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(write_only=True)

    interfaces = InterfaceModelSerializer(label='所属接口的信息', help_text='所属接口的信息',
                                          read_only=True, many=True)


    class Meta:
        model = ProjectsModel

        fields = ('name', 'leader', 'tester','programmer','publish_app','email','interfaces')
        extra_kwargs = {
            'id': {
                'read_only': True},
            'name': {'max_length': 10, 'min_length': 5,
                     'validators': [UniqueValidator(ProjectsModel.objects.all(), message="项目名称不可重复!"),
                                    is_contain_project_word]},
            'tester': {
                'max_length': 10, 'min_length': 5,
                'error_messages': {"min_length": "tester长度不能少于5位", "max_length": "tester长度不能大于10位",
                                   "required": "tester字段为必填项"}
            },
            'desc': {
                'allow_null': True, 'default': 'desc默认值'
            },
            'programmer':{'write_only': True},
            'publish_app':{'write_only': True}
        }

    def create(self, validated_data):
        validated_data.pop('email')
        return super().create(validated_data)

    def update(self, instance, validated_data):
        return super().update(instance, validated_data)

一、模型类序列化器的使用

 在上面的模型序列化类中:

  • 可以继承ModelSerializer类或者ModelSerializer的子类,来创建模型序列化器类;
    • 模型序列化器类中可以重新定义序列化器字段,优先级大于自动生成的同名字段
    • 如果新定义的字段不需要存储,则需要在调用create()方法时候删除掉该字段,比如上面的email字段

 内部类 class Meta:

  • model=指定的模型类
    • 必须得在Meta内部类中使用model属性指定,参考的模型类;
    • 通过指定的模型类,来自动生成序列化器字段以及相关校验规则;
  • fields
    • 可以使用fields属性来指定哪些模型类中的字段,需要自动生成序列化器字段;
    • 指定一些个字段,例如  fields = ('name', 'leader')
      • 如果fields中没有'programmer','publish_app',前端可以不传这些字段,即使前端传递了这两个参数,也不会进行校验,最后也不会存到数据库中
      • fields中有'programmer','publish_app',
        ​​​​​若前端传递了这两个参数
        • 如果属性为只读模式,则不会校验,返回为空,数据库为null
        • 如果属性为只写模式,则会进行校验,最后也会存到数据库中,不会返回给前端
        • 如果属性为读写模式,则会进行校验,最后也会存到数据库中和返回给前端
      • fields中有'programmer','publish_app',若前端没有传递这两个参数
        • 如果属性为只读模式,则不会校验,返回为空
        • 如果属性为只写模式,则校验不通过,报错 需要传这些参数
        • 如果属性为读写模式,则校验不通过,报错 需要传这些参数
    • 指定全部字段,例如 fields = '__all__'
    • 排除某些字段,例如 exclude=('name','leader')
  • extra_kwargs
    • 字典类型;可以设置模型类字段的属性 
  •  自定义的create方法与update方法
    • 我们可以调用父类的create方法与update方法来代替自己写的方法

    def create(self, validated_data):
        validated_data.pop('email')
        return super().create(validated_data)

    def update(self, instance, validated_data):
        return super().update(instance, validated_data)

二、关联字段序列化

class InterfacesModel(BaseModel):

    id = models.IntegerField(primary_key=True, verbose_name="id主键", help_text="id主键")
    name = models.CharField(unique=True,max_length=200, verbose_name="接口名称", help_text="接口名称")
    tester = models.CharField(max_length=200, verbose_name="测试人员", help_text="测试人员")
    desc = models.CharField(max_length=200, verbose_name="简要描述", help_text="简要描述")

    # 数据表中,会创建名称为外键字段_id的字段名
    # project = models.ForeignKey("projects.ProjectsModel", on_delete=models.CASCADE)
    project = models.ForeignKey(ProjectsModel, on_delete=models.CASCADE,related_name="interfaces")

    # models.OneToOneField指定一对一的外键字段
    # models.ManyToManyField指定多对多的外键字段
    class Meta:
        db_table = "tb_interfaces"
        verbose_name = "接口表"

    def __str__(self):
        return self.name

1、父表序列化器类中关联从表字段

  • 一对多:父表序列化器类中如果定义从表关联字段,有多条从表数据,那么必须的添many=True,并且interfaces要加到fields里
  • 直接在主表的序列化对象中创建从表的序列化器类的对象,并赋值给字段名为“从表模型类名小写_set”的字段,然后将“从表模型类名小写_set”的字符名添加到Meta子类的fields属性中
    • 如果在从表定义了主表关联字段related_name
      • 在主表的序列化器类中,将外键字段名称“从表模型类名小写_set”更改为related_name属性的值
        # interfaces = serializers.PrimaryKeyRelatedField(read_only=True, many=True)

    • 如果在从表没有定义主表关联字段related_name
      • 则字段名为: 从表模型类名小写_set
        # interfaces_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
        

1、输出的是主表id关联从表对应的从表id

        interfaces = serializers.PrimaryKeyRelatedField(read_only=True, many=True)

2、输出的是主表id关联从表的对应从表名

        interfaces=serializers.StringRelatedField(many=True)

3、输出的是主表id关联从表的从表查询集

        interfaces = InterfaceModelSerializer(label='所属接口的信息', help_text='所属接口的信息',read_only=True, many=True)

2、从表序列化器类中关联父表字段

1、输出的是从表关联主表id的对应主表id

  • project=serializers.PrimaryKeyRelatedField(queryset=ProjectsModel.objects.all())
  • 并且project要加到fields里

 创建从表数据

查询从表数据

 2、输出的是从表关联父表id的对应主表名

        project=serializers.StringRelatedField(many=True)

 备注:

因为模型类中定义的project是主表的主键id或者是主表模型类对象,则就要求这个字段是int类型或者模型类对象,而这个方法中的project字段又是字符串类型,所以创建interfaces数据时候就会报错

3、输出的是从表关联父表id的主表查询集

        如果从表---主表是多对一的关系,则不需要添加属性many=True,否则会报错

       project = ProjectModelSerializer(label='接口所属项目的信息', help_text='接口所属项目的信息',read_only=True)

 备注:

因为模型类中定义的project是主表的主键id或者是主表模型类对象,则就要求这个字段是int类型或者模型类对象,而这个方法中的project字段又是字符串类型,所以创建interfaces数据时候就会报错

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

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

相关文章

git常见操作汇总

存档,方便本人查询~ 除了add、commit、push、pull外有些操作也是需要掌握的~在复习之前先准备一下需要的项目: mkdir git-demo1 cd git-demo1 git init基础操作 # 在工作区新增一个README.md文件,并写入 # Hello World# 查看哪些原件做了修…

Java安全——安全管理器

Java安全 安全管理器 Java安全管理器是一个Java安全模型中的一个组件,主要的作用是提高Java应用程序的安全性。Java应用程序中的每个线程都会对安全管理器进行检查,在执行代码之前,会先经过安全管理器的核验,安全管理器根据代码来…

Flink SQL之Temporal Joins

1.Temporal Joins(时态JOIN) 时态表是一个随时间演变的表,在Flink中也称为动态表。 时态表中的行与一个或多个时态周期相关联,并且所有Flink表都是时态的(动态的)。时态表包含一个或多个版本化的表快照&a…

Oracle数据库中的包的介绍及示例

Oracle的包是一种封装存储过程,函数,变量和游标等代码对象的方法。包可以视为一组相关的程序单元,它们共享相同的命名空间和存储空间。包可以被看做是一个数据库程序库,它包含一个或多个程序单元,这些单元可以被视为一…

图片加载失败捕获上报及处理

图片加载失败捕获上报及处理 前端页面中加载最多的静态资源之一就是图片了,当出现图片加载失败时,非常影响用户体验。这时候我们就需要对图片是否成功加载进行判断,并对图片加载失败进行处理。 图片加载监听 单个捕获 HTML中的img标签可以…

vue 组件简单实例及传参交互

前言:vue 可以比较灵活的使用 html的片段,并将html的片段进行数据隔离,参数也可以互相传递,组件与组件之间也可以进行数据的交互 合理的使用组件可以避免重复代码或者很方便的调用第三方组件库 vue组件 简单实例组件传参实际应用父子组件交互…

SpringBoot2+Vue2实战(四)进行组件内容拆分及路由实现

一、拆分 新建包&#xff1a; Aside和Header都是组件 User为视图 Aside.vue&#xff1a; <template><el-menu :default-openeds"[1, 3]" style"min-height: 100%; overflow-x: hidden"background-color"rgb(48, 65, 86)"text-color…

I2C总线协议详解

I2C总线物理拓扑结构 I2C总线物理拓扑图 I2C 总线在物理连接上非常简单&#xff0c;分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制&#xff0c;来 产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时&#…

linux下使用pyqt5的QMediaPlayer制作简易播放器(存在进度条、前进、后退、暂停、打开、播放等操作)

目录 1. 问题2. 解决3. 效果 1. 问题 关于pyqt5的qmediaplayer模块制作简易播放器&#xff0c;网上很多博客都是win下的&#xff0c;放在linux系统会出问题&#xff1b;另外&#xff0c;部分博客缺少文件&#xff0c;无法直接使用。 参考博客《基于pyqt5的QMediaPlayer实现视…

android studio git使用

pull代码 我们从远程仓库拉取代码时&#xff0c;一般有下面的两个选项 当使用Android Studio拉取代码时&#xff0c;有两种常见的选项&#xff1a;合并&#xff08;merge&#xff09;传入的更改到当前分支和变基&#xff08;rebase&#xff09;。 合并&#xff08;Merge&…

【Django学习】(九)自定义校验器_单字段_多字段校验_模型序列化器类

之前学习了视图集里运用序列化器进行序列化和反序列化操作&#xff0c;定义序列化器类&#xff0c;需要继承Serializer基类或者Serializer的子类&#xff1b; 这次我们将学习如何自定义校验器、如何进行单字段或者多字段校验&#xff0c;最后初步使用模型序列化器 一、自定义…

OPPO手机无网络可支持3km通信,对讲机将被淘汰?

OPPO在2019世界移动通信大会即MWC上海发布了一项新技术&#xff0c;被称为“无网络通信技术”&#xff08;MeshTalk&#xff09;。这是OPPO自主研发的一项去中心化通讯技术&#xff0c;能够在没有蜂窝网络、Wi-Fi、蓝牙的情况下&#xff0c;实现3km内通讯。 无网通信技术 不过…

Java教程-Java异常抛出

在Java中&#xff0c;异常允许我们编写高质量的代码&#xff0c;可以在编译时检查错误而不是在运行时&#xff0c;并且我们可以创建自定义异常&#xff0c;使代码的恢复和调试更加容易。 Java的throw关键字 Java的throw关键字用于显式地抛出异常。 我们指定要抛出的异常对象。异…

华为breeze ideploy部署流程示例

https://www.cnblogs.com/withfeel/p/11640877.html 华为breeze ideploy部署流程示例

Canal对MySQL进行数据迁移

Canal简单介绍 贴个官方网址&#xff1a;阿里巴巴MySQL binlog 增量订阅&消费组件 架构图&#xff1a; 基于日志增量订阅和消费的业务包括 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处理 当前的 cana…

CSS知识点汇总(十一)--回流重绘

文章目录 怎么理解回流跟重绘&#xff1f;什么场景下会触发&#xff1f;1、回流和重绘是什么&#xff1f;2、如何触发回流和重绘3、如何避免回流和重绘的发生 怎么理解回流跟重绘&#xff1f;什么场景下会触发&#xff1f; 1、回流和重绘是什么&#xff1f; 在HTML中&#xf…

二十、socket套接字编程(二)——TCP

文章目录 一、TCP套接字接口&#xff08;一&#xff09;inet_aton &#xff08;和inet_addr一样&#xff0c;换一种方式而已&#xff09;&#xff08;二&#xff09;socket()&#xff08;三&#xff09;bind()&#xff08;四&#xff09;listen()&#xff08;五&#xff09;acc…

ASP.NET Core MVC -- 入门

先决条件&#xff08;开发配置二选一&#xff09;&#xff1a; 带有 ASP.NET 和 Web 开发工作负载的Visual Studio Visual Studio Code Visual Studio Code用于 Visual Studio Code 的 C#&#xff08;最新版本&#xff09;.NET 7.0 SDK 创建Web应用 visual studio ctrl F5 …

云原生之深入解析Kubernetes网络流量的流转路径

一、Kubernetes 网络要求 Kubernetes 网络模型定义了一组基本规则&#xff1a; 在不使用网络地址转换 (NAT) 的情况下&#xff0c;集群中的 Pod 能够与任意其他 Pod 进行通信&#xff1b; 在不使用网络地址转换 (NAT) 的情况下&#xff0c;在集群节点上运行的程序能与同一节点…

王道《计算机网络》思维导图汇总

第一章 1.1.1 概念与功能 1.1.2 组成与分类 1.1.3 标准化工作及相关组织 1.1.4 性能指标 速率 带宽 吞吐量 时延 时延带宽积 往返时延RTT 利用率 1.2.1 分层结构、协议、接口、服务 1.2.2 OSI参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 1.2.4 TCP/IP 参…