前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >django drf_mnbkdrf

django drf_mnbkdrf

作者头像
全栈程序员站长
发布2022-09-20 21:41:53
发布2022-09-20 21:41:53
41700
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

前言

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

ModelSerializer

先来看下ModelSerializer的代码结构如下:

可以看到ModelSerializer是继承自Serializer,官方是这么介绍到的

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

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

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

代码语言:javascript
代码运行次数:0
复制
class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields =  ['id', 'name', 'age', 'sex']

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

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

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

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

代码语言:javascript
代码运行次数:0
复制
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模型内容:

代码语言:javascript
代码运行次数:0
复制
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,一个班级中可以有多个学生,而一个学生只能属于一个班级,典型的一对多的关系,接下来我们看序列化函数

代码语言:javascript
代码运行次数:0
复制
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/,会看到返回的学生表中包含了班级表的内容,如下

代码语言:javascript
代码运行次数:0
复制
{
    "id": 1,
    "name": "jkc",
    "age": 18,
    "sex": 1,
    "classes": {
        "id": 1,
        "name": "班级1",
        "students": [
            1,
            15,
            18
        ]
    }
},

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • ModelSerializer
  • 指定嵌套序列化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档