django drf_mnbkdrf

django drf_mnbkdrf前言我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializerModelSerializer先来看下ModelSer

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer
 

ModelSerializer

先来看下ModelSerializer的代码结构如下:
django drf_mnbkdrf
可以看到ModelSerializer是继承自Serializer,官方是这么介绍到的

ModelSerializer只是一个常规的Serializer,只是做了以下事情

  • 将自动填充一组默认字段
  • 将自动填充一组默认验证程序
  • 提供了默认的.create().update()实现

我们将之前的Serializer类现在用ModelSerializer来实现

class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex']

默认情况下,所有的模型的字段都将映射到序列化器上相应的字段。
如果你希望在模型序列化器中使用默认字段的一部分,你可以使用fieldsexclude选项来执行此操作

  • fields:需要哪些模型字段
  • exclude:排除哪些模型字段

官方强烈建议你使用fields属性显式的设置要序列化的字段。这样就不太可能因为你修改了模型而无意中暴露了数据。
如果我们需要使用模型的全部字段,则可以将fields属性设置成'__all__'

默认情况下,fields里的字段既参加序列化也参加反序列化,如果我们想某个字段只序列化或反序列化可以定义extra_kwargs字段,代码如下:

class StudentModelSerializer(serializers.ModelSerializer):
    # classes = ClassesModelSerializer(read_only=True)
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex', 'password']
        extra_kwargs = {
            "password": {
                "write_only": True
            },
           "id": {
               "read_only": False
           }
        }

上面代码如果不写extra_kwargs,那么password默认参加序列化和反序列化,那么密码就会返回给前端了,这里我们定义了extra_kwargs字段,在字段中设置了password只能反序列化,那么用户只能提交密码,而后台不会返回密码给前台
当然,extra_kwargs也可以自定义错误信息,如果业务有需要,可以查看官方文档
 

指定嵌套序列化

上面我们都是单模型的序列化,但是实际业务中我们不会这么简单,一定会遇到关系模型的序列化,下面我们来讲解关系模型的序列化
首先我们看一下models模型内容:

class Classes(models.Model):
    name = models.CharField(max_length=20, verbose_name="班级名")

    class Meta:
        db_table = "classes"


class Student(models.Model):

    SEX_CHOICES = (
        (1,'男'),
        (2, '女')
    )

    name = models.CharField(max_length=20, verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
    sex = models.IntegerField(choices=SEX_CHOICES, default=1, verbose_name='性别')
    classes = models.ForeignKey(Classes, on_delete=models.SET_NULL, verbose_name="班级", null=True, related_name='students')
    class Meta:
        db_table = "student"

我们定义了Student学生类,里面定义了一个外键classes关联Classes,一个班级中可以有多个学生,而一个学生只能属于一个班级,典型的一对多的关系,接下来我们看序列化函数

class ClassesModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classes
        fields = ['id', 'name', 'students']


class StudentModelSerializer(serializers.ModelSerializer):
    classes = ClassesModelSerializer(read_only=True)
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex', 'classes']

我们在StudentModelSerializer中增加了一个额外的字段classes,并将字段设置为只读,一般外键只做序列化,并且在fields列表中添加了该字段。
注意:我们在创建外键模型时,必须在外键中设置related_name,如果没设置,序列化时不会返回关联的外键内容

接下来我们访问http://127.0.0.1:8000/drf/student/,会看到返回的学生表中包含了班级表的内容,如下

{
    "id": 1,
    "name": "jkc",
    "age": 18,
    "sex": 1,
    "classes": {
        "id": 1,
        "name": "班级1",
        "students": [
            1,
            15,
            18
        ]
    }
},
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166138.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GMT时间格式转换(Mon Feb 13 08:00:00 GMT+08:00 2012)

    GMT时间格式转换(Mon Feb 13 08:00:00 GMT+08:00 2012)普通的时间转换问题我这里就不再罗嗦了 我想大家应该都会那种低级的转换问题吧 现在我向大家总结一下如何转换 GMT 时间格式 这种格式的转换方法网上还不是很多 所以有必要总结一下 也算给有需要的朋友一个小小的帮助啦 首先先来了解一下 GMT 的时间格式 MonFeb1308 00 00GMT 08 002012 可能还会有其他的格式类似 SunSep0 00 00G

    2025年6月14日
    3
  • Github提交代码却没有显示绿色小格子?帮你找回绿格子!

    Github提交代码却没有显示绿色小格子?帮你找回绿格子!辛辛苦苦提交的代码却没有绿格子?在github上提交代码之后,进入github上面查看自己的提交,可以看看刚刚的提交内容,但是却一直没有显示绿格子,一个原因是本地git的配置邮箱和github上面的邮箱不一致。解决方法:查看你的本地配置邮箱在命令行中输入:gitconfiguser.email查看你的本地配置邮箱.看看是否和github上面绑定的邮箱一致,如果不一致则更改一下。…

    2022年9月28日
    4
  • 三极管导通条件[通俗易懂]

    三极管导通条件[通俗易懂]1、对于NPN型三极管来说,其功能是用基极B极小的电流去引出集电极C巨大的电流,Ibe电流大小由Ib基极电流决定。2、三极管相当于两个二极管组成,所以只要PN结压差大于0.7V,有电流有就导通了3、NPN型:截止态:Ube<0.7V放大态:Ube>0.7V,Uc>Ub>Ue,集电极处于正向压差,基极处于反向压差PNP:截止态:Ueb<0.7V…

    2022年6月30日
    90
  • HttpCanary教程(tcpnodelay设置)

    HttpClient优化思路1、池化2、长连接3、httpclient和httpget复用4、合理的配置参数(最大并发请求数,各种超时时间,重试次数)5、异步6、多读源码1.背景我们有个业务,会调用其他部门提供的一个基于http的服务,日调用量在千万级别。使用了httpclient来完成业务。之前因为qps上不去,就看了一下业务代码,并做了一些优化,记录在这里。先对比前后:优化之…

    2022年4月16日
    291
  • php网页运行不出来_phpstudy启动后就停止

    php网页运行不出来_phpstudy启动后就停止phpstudy中的nginx无法启动,报错:10049最近使用phpstudy的nginx+php环境编写laravel项目,老是报错,nginx无法启动,闪了一下,又变成了红色。下面整理一下解决方案:1.查看nginx的配置文件,一般是80端口,我这里根据不同项目修改了,所以我的是8093:2.win+R键,输入cmd,输入端口查询命令netstat-aon|findstr80,查看响应端口是否被占用,这里举例80端口;3.可以看到占用80端口程序的pid是3364,然后输入命令task

    2022年9月28日
    3
  • 升级公告:由社区推动的cBridge 2.0功能迭代升级即将到来

    升级公告:由社区推动的cBridge 2.0功能迭代升级即将到来我们将在北京时间2021年12月3日上午10点推出cBridge2.0的一次功能迭代升级,以满足我们用户和开发者社区提出的一些关键功能需求。此次升级旨在让cBridge2.0更好地为通用的多链dApps和原生资产跨链桥接提供支持。升级期间,cBridge跨链转账服务会暂停约3小时。作为此次升级的一部分,所有LP需要迁移已提供的全部流动性。我们将为LP提供足够的gastoken以支付cBridge2.0目前已支持的链上的全部迁移成本,大家不必担心手续费的问题。迁移可以在升级前…

    2022年5月4日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号