博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django-rest-framework 接口实现 ModelSerializer 使用
阅读量:6336 次
发布时间:2019-06-22

本文共 2662 字,大约阅读时间需要 8 分钟。

ModelSerializer 使用

  • 不需要单独写字段的 序列化工具类 相当于 ModelForm

写法:以及 注意事项:

  1. 继承 serializers.ModelSerializer

  2. 在类中填写 class Meta: 指定数据

    • model=models.Books 指定表

      fields = '__all__' 指定字段

      depth = 1 # 所有有关系的字段都变成 read_only 一般不使用

      exclude = [] # 排除某个字段

      extra_kwargs = { } # 每个字段的一些额外参数

      'booksType': {'write_only': True},

  3. 对于特殊字段的 显示

    • 定义字段以及字段对应的方法
    • 字段名对应models 中的字段名 也可以不对应 只针对于特殊 显示 多选 外键 多对多
    • 指定为 serializers.SerializerMethodField(read_only=True)的字段类型
    • SerializerMethodField 会自动去找 get_字段名 的方法执行
    • 方法定义 方法名要加上get_的前缀 def get_booksType_info(self, book_obj):
    • book_obj 就是当前别序列化的对象

    方法中:

    • '''处理choices 字段''' 同样返回 对象的 choices字段 显示方法 get_字段名_display

      return book_obj.get_booksType_display()

    • '''处理 foreignkey 字段''' 调用 外键对应的 Serializer序列化类 参数传递 当前处理的 对象的 外键字段

      return PublisherSerializer(book_obj.publisher).data 使用 .data来获取被序列化的 内容并返回

    • '''处理 manytomany 字段''' 调用 外键对应的 Serializer序列化类 参数传递当前对象的多对多字段 用all()取出对应的 所有 内容 并给出 many=true 的参数进行循环 操作 因为对应的 事多条内容 .data取出序列化的内容 并返回

      return AuthorSerializer(book_obj.authors.all(),many=True).data

特殊字段的展示

  1. 对于页面中 原值字段的 显示问题 在Meta: 中 设置额外的字段来进行设置 设置为只能写入
class AuthorSerializer(serializers.Serializer):    id = serializers.IntegerField(required=False)    name = serializers.CharField(max_length=32)class PublisherSerializer(serializers.Serializer):    id = serializers.IntegerField(required=False)    name = serializers.CharField(max_length=32)class BooksModelSerializer(serializers.ModelSerializer):    '''相当于 modelForm'''    # SerializerMethodField 会自动去找 get_字段名 的方法执行    # booksType_info = serializers.SerializerMethodField(read_only=True)    # 简化写法 如果返回值是一行 可以不用写函数 根据 获取的  内容选择 字段    booksType = serializers.CharField(source='get_booksType_display')    publisher_info = serializers.SerialinmnnnnnnnnzerMethodField(read_only=True)    authors_info = serializers.SerializerMethodField(read_only=True)    def get_booksType_info(self, book_obj):        '''处理choices 字段'''        #  obj 就是当前被序列化的对象        return book_obj.get_booksType_display()    def get_publisher_info(self, book_obj):        '''处理 foreignkey 字段'''        # book_obj.publisher  ==> 得到和我这本书关联的出版社对象        return PublisherSerializer(book_obj.publisher).data    def get_authors_info(self, book_obj):        '''处理 manytomany 字段'''        print(book_obj)        return AuthorSerializer(book_obj.authors.all(),many=True).data    class Meta:        model = models.Books        fields = '__all__'        # depth = 1  # 所有有关系的字段都变成 read_only        # exclude = []  # 排除某个字段        extra_kwargs = {  # 每个字段的一些额外参数            'booksType': {'write_only': True},            'publisher': {'write_only': True},            'authors': {'write_only': True},        }

转载于:https://www.cnblogs.com/zhang-zi-yi/p/10447323.html

你可能感兴趣的文章
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>
百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立 ...
查看>>
10 个 Linux 中方便的 Bash 别名
查看>>
[Server] 服务器配置SSH登录邮件通知
查看>>
全新 DOCKER PALS 计划上线,带给您不一样的参会体验! ...
查看>>
Android开发之自定义View(二)
查看>>
python爬虫之微打赏(scrapy版)
查看>>
自制操作系统Antz day08——实现内核 (中) 扩展内核
查看>>
poj-1056-IMMEDIATE DECODABILITY(字典)
查看>>
阿里云容器Kubernetes监控(二) - 使用Grafana展现Pod监控数据
查看>>
区块链应用 | 不知道什么时候起,满世界都在谈区块链的事情
查看>>
小程序爆红 专家:对简单APP是巨大打击
查看>>
FarBox--另类有趣的网站服务【转】
查看>>
在非纯色背景上,叠加背景透明的BUTTON和STATIC_TEXT控件
查看>>
Distributed2:Linked Server Login 添加和删除
查看>>
海量数据处理相关面试问题
查看>>
Python-time
查看>>