首页 > 其他分享 >37.序列化器关系类型字段

37.序列化器关系类型字段

时间:2022-10-08 19:01:14浏览次数:63  
标签:read many 37 关联 only 类型 序列化 True

关系字段用于表示模型之间的关联 Django中存在ForeignKey、MantToManyField和OneToOneField三种正向关系,以及反向关联和自定义关联 当继承 ModelSerializer 类的时候,包括关系型字段在内的所有字段会自动生成

StringRelatedField
    使用对象的 __str__ 方法来表示关联的对象
    这个字段其实也就是将关联对象的字符串表示形式的信息拿来,放到自己的序列化类中
    供API视图使用并渲染,然后传递给前端
    #Model示例
    def __str__(self):
        return '%d: %s' % (self.order, self.title)
    # serializer
    info = serializers.StringRelatedField(many=True)
    
    该字段是只读的


PrimaryKeyRelatedField
    PrimaryKeyRelatedField 使用关联对象的主键id值来表示对象
    info = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
    默认情况下,这种字段关联方式是可读可写的。可以通过添加 read_only=True 标识,变成只读
    参数:
        queryset - 当对字段的输入数据进行验证的时候,用于查询模型实例的查询集。必须显式的提供这个参数,或者设置 read_only=True 。
        many - 如果关联的是一个复数数量的对象,必须将此参数设置为 True 。
        allow_null - 默认为False。如果设置为 True ,在可空的关联上,该字段将可以接收None 或空字符串。
        pk_field - 指定序列化/反序列化过程中,使用的主键字段类型。例如pk_field=UUIDField(format='hex') 将序列化一个UUID主键值
        
HyperlinkedRelatedField
    HyperlinkedRelatedField 使用关联对象的超链接形式来标识关联对象
    info = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name='track-detail')
    默认情况下,这种字段关联方式是可读可写的。可以通过添加 read_only=True 标识,变成只读
    这种关系字段适合包含单独主键或者slug参数的URLs,
    参数:
        view_name - 处理关联对象URL的视图。如果你使用的是标准的路由类,它必须是一个<modelname>-detail 格式的字符串。此参数必填
        queryset - 当对字段的输入数据进行验证的时候,用于查询模型实例的查询集。必须显式的提供这个参数,或者设置 read_only=True 。
        many - 如果关联的是一个复数数量的对象,必须将此参数设置为 True 。
        allow_null -默认为False。如果设置为 True ,在可空的关联上,该字段将可以接收None 或空字符串。
        lookup_field - 该参数的默认值为 'pk' ,表示用主键id在视图种查找关联的对象,一般我们不需要修改这个参数。它必须和对应视图的URL关键字参数一致,你这里如果改了,在视图中也必须跟着改。
        lookup_url_kwarg - 指定上面参数值的名字,一般使用 lookup_field 。大多数情况下,我们不用修改这个参数,默认就好,除非你需要自定义一大堆,不要给自己挖坑。
        format - 如果URL种使用了格式后缀,超链接字段将使用同样的格式后缀,除非使用这个 format 参数另外指定后缀形式
        
SlugRelatedField
    SlugRelatedField 使用某个指定的字段的值作为关联对象的表示形式。比如拿对象的名字、或者邮箱、或者昵称、或者地址等等
    info = serializers.SlugRelatedField(many=True,read_only=True,slug_field='title')
    默认情况下,这种字段关联方式是可读可写的。可以通过添加 read_only=True 标识,变成只读
    参数:
        slug_field - 指定用来表示关联对象的字段,该参数必填。
        queryset - 同上
        many - 同上
        allow_null - 同上
        
        
HyperlinkedIdentityField
    这种字段可以使用超链接身份关联,使用较少
    该字段只读
    view_name - 同前。必填。
    lookup_field - 同前
    lookup_url_kwarg - 同前
    format - 同前
  嵌套关联 可以将序列化类作为字段,来表示嵌套关联 如果关联的是一个复数数量的一些,必须将many参数设置为True

class TextSerializer(serializers.ModelSerializer):
    # 设置嵌套关联的字段
    info = CategorySerializer(many=True,read_only=True)

    class Meta:
        model = Text
        fields = ('url', 'id', 'title', 'content', 'auth', 'category', 'created','info') #序列化
默认情况下,嵌套关联是只读的!如果你想设置可读写的嵌套关联,你必须自己实现create() 与/或 update() 方法,显式地指定如何保存子关系
#示例
def create(self, validated_data):
    infos_data = validated_data.pop('info')
    text = TextModel.objects.create(**validated_data)
    for info_data in infos_data:
        CategoryModel.objects.create(text=text, **track_data)
    return text
    自定义关系类型字段
  • 如果现有的关系样式都不适合,那实现一个完全自定义的关系字段
  • 要自定义关系类型字段,必须先继承 RelatedField 类
  • 然后实现 .to_representation(self, value) 方法
  • 此方法将字段的目标作为“value”参数,并应返回对象序列化后的表示形式,“value”参数通常是模型实例
  • 如果想实现可读写的关系类型字段,需要实现 .to_internal_value(self, data)方法
  • 如果想提供一个基于 context 的动态查询集,需要覆盖 .get_queryset(self) 方法

标签:read,many,37,关联,only,类型,序列化,True
From: https://www.cnblogs.com/Mickey-7/p/16769898.html

相关文章

  • 学习Python之数据类型-1
    1、数字之运算(1)整数int#数字类型:整数inta=1b=2print(a+b)print(a-b)print(a*b)print(a/b)(2)小数float#数字类型:小数floata=1.0b=0.1print(a+b)print(a-b)p......
  • 字面量、注释、变量、数据类型、数据类型转换
    字面量固定的值称为字面量数据类型单行注释#注释内容多行注释"""注释内容"""变量在程序运行时,能储存计算结果或能表示值的抽象概念#特征变......
  • Java中的无符号类型
    背景计算机科班出身大多学过离散数学,或者理工类专业也大多学习过C或C++语言,从中我们了解到基本类型的整形有short、int、long等,还分别有无符号(unsigned)和带符号(sign......
  • vue.js3:用el-loading显示加载动画([email protected] / [email protected])
    一,el-loading1,文档地址:https://element-plus.gitee.io/zh-CN/component/loading.html2, 查看element-plus的版本:liuhongdi@lhdpc:/data/vue/imgtouch$npmlist......
  • js检测数据类型得四种方式
    1.typeof:返回一个字符串,表示操作数的类型。  语法:typeof(变量)//ortypeof变量示例:  console.log(typeof2)//number  console.log(type......
  • vue.js3:axios图片上传([email protected] / [email protected])
    一,安装axios库1,相关地址官网:https://axios-http.com/代码地址:https://github.com/axios/axios2,安装liuhongdi@lhdpc:/data/vue/axios$npminstall--......
  • SE91 SAP消息类型
    SE91SAP消息类型  E:ErrorW:WarningI :InformationA:AbortionS:Success标准:      MESSAGE ID sy-msgid TYPE 'X' NUMBER sy-msgn......
  • java--基本类型值传递,和引用类型String,数组的区别
    //java语言:值传递//数据类型:基本类型:4种8类,参数传递:值传递//引用类型:String数组等,传递的是内存地址值,但String值不会改变,相当于常量池的数据重新给它赋值//参数类......
  • 【TypeScript教程】# 3:TS的类型声明
    说明尚硅谷TypeScript教程(李立超老师TS新课)学习笔记。类型声明类型声明是TS非常重要的一个特点通过类型声明可以指定TS中变量(参数、形参)的类型指定类型后,当为变量赋值时,TS......
  • [题解] Codeforces Dytechlab Cup 2022 1737 A B C D E 题解
    傻*Dytechlab还我rating!(不过目前rating还没加上去,据说E是偷的说不定要unrated)实在没预料到会打成这样。。。求点赞点我看题A.ElaSortingBooks从前往后一位一位确......