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

这篇具有很好参考价值的文章主要介绍了【Django学习】(十)模型序列化器_关联字段序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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)【Django学习】(十)模型序列化器_关联字段序列化

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

        interfaces=serializers.StringRelatedField(many=True)

 会调用关联从表的序列化器类里定义的__str__方法,然后输出

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

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

        interfaces = InterfaceModelSerializer(label='所属接口的信息', help_text='所属接口的信息',read_only=True, many=True)【Django学习】(十)模型序列化器_关联字段序列化

4、自定义输出关联从表的某一个字段属性值
interfaces=serializers.SlugRelatedField(slug_field='tester',read_only=True,many=True)

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

在这里推荐指定唯一键,比如name或者id之类的 ,这样才能够区分开到底关联的是父表的哪条数据

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

 从表因为模型类里定义了主表关联字段,所以从表序列化器类默认是创建主表关联字段的

1、输出的是从表关联主表id的对应主表id
  • project=serializers.PrimaryKeyRelatedField(queryset=ProjectsModel.objects.all())
  • 并且project要加到fields里
 创建从表数据

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

查询从表数据

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

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

        project=serializers.StringRelatedField(many=True)

  会调用关联主表的序列化器类里定义的__str__方法,然后输出

 备注:

StringRelatedField只能用于序列化输出;

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

3、【主表序列化器类】输出的是从表关联主表id的主表查询集

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

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

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

4、【SlugRelatedField】指定父表模型类中的某一个字段(尽量使用具有唯一约束的字段)进行输入或输出

4.1只输出该字段

  • 如果仅仅只需要输出那么添加read_only=True即可
  • project = serializers.SlugRelatedField(slug_field='desc', read_only=True)

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

在这里推荐指定唯一键,比如name或者id之类的 ,这样才能够区分开到底关联的是父表的哪条数据 

 4.2既要输入又要输出

  • 如果需要进行反序列化器输入(校验),必须得指定queryset
  • project = serializers.SlugRelatedField(slug_field='desc', queryset=ProjectsModel.objects.all())

如果不是唯一字段,可能会报错 :

projects.models.ProjectsModel.MultipleObjectsReturned: get() returned more than one ProjectsModel -- it returned 9!

【这个报错是说返回的模型类对象超过了1个,实际返回了9个】

所以我们最好设置唯一键文章来源地址https://www.toymoban.com/news/detail-511369.html

到了这里,关于【Django学习】(十)模型序列化器_关联字段序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • drf——Request源码分析、序列化组件、序列化类的使用(字段类和参数)、反序列化校验和保存

    views.py中 urls.py中 序列化类 字段 字段构造方式 BooleanField BooleanField() NullBooleanField NullBooleanField() CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) EmailField EmailField(max_length=None, min_length=None, allow_blank=False) RegexField RegexField(regex, max_length=None, min_length=None, a

    2024年02月05日
    浏览(40)
  • 设置Json序列化时字段的顺序

    1. 背景 在部分使用场景(如元数据驱动,后台接口仅返回序列化后的json字符串,前端需要根据每个字段在前端呈现),需要手动设置字段的长度。通常情况下,框架是有默认的顺序,如 jackson 默认使用字段声明的顺序, fastjson 默认是使用字典序。在这种业务场景下,就需要

    2024年02月07日
    浏览(44)
  • 【Java反序列化】@JsonAlias字段别名

       @JsonAlias 是 Jackson 库提供的一个注解,用于在反序列化 JSON 数据时,为字段或方法指定多个可接受的名称或别名。   当你使用 @JsonAlias 注解时,可以为字段或方法指定一个或多个别名。这样,当 Jackson 反序列化 JSON 数据时,它将尝试使用给定的别名来匹配字段或方法的

    2024年02月16日
    浏览(44)
  • SpringBoot利用自定义json序列化器实现敏感字段数据脱敏

    物料准备: 1.hutool依赖 2.自定义的jackson序列化器 3.测试@JsonSerialize效果 因为案例代码用到了hutool提供的DesensitizedUtil数据脱敏工具类,这里要引入hutool的依赖。 如果你需要自定义 数据脱敏的逻辑,可以不引入这个依赖 自定义一个手机号脱敏序列化器 自定义一个邮箱脱敏序列化

    2024年02月12日
    浏览(68)
  • Django REST Framework入门之序列化器

    Django REST framework (简称:DRF)是一个强大而灵活的 Web API 工具。遵循RESTFullAPI风格,功能完善。 能简化序列化及开发REST API视图的代码,大大提高REST API的开发速度;提供灵活的路由API,内置了强大的认证和授权机制 Django REST framework 最新版使用要求 在settings.py文件的INSTALLED_

    2024年01月21日
    浏览(44)
  • Django REST framework中的序列化Serializers

    序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。 简单来说,服务器通过api 返回数据(json格

    2024年02月09日
    浏览(33)
  • 【Django】Task4 序列化及其高级使用、ModelViewSet

    Task4主要了解序列化及掌握其高级使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视图。 Django 的序列化是指将复杂的数据结构(通常是数据库中的模型对象)转换为可以在不同应用程序间传输和存储的格

    2024年02月11日
    浏览(43)
  • 由Django-Session配置引发的反序列化安全问题

    漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE: 在Django中, SESSION_ENGINE  是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。 SESSION_ENGINE  设置项允许您选择不同的后端引擎来存储会话数据,例如: 数据库后端  ( django.contrib.sessions.b

    2024年02月08日
    浏览(49)
  • LibTorch实战四:模型序列化

    目录 在C++环境中加载一个TORCHSCRIP Step1: 将pytorch模型转为torch scrip类型的模型 1.1、基于Tracing的方法来转换为Torch Script 1.2、基于Annotating (Script)的方法来转换为Torch Script Step2: 序列化torch.jit.ScriptModule类型的对象,并保存为文件 Step3: 在libtorch中加载ScriptModule模型 总结     

    2024年02月06日
    浏览(40)
  • Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包