python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)

介绍

  • 上篇文章我们介绍了最基础的序列化器(serializers),python Django Rest_Framework框架 APIView介绍与序列化器详解(图文并茂版)使用它对数据对象进行序列化、反序列化时操作是比较麻烦的
  • 如果我们需要进行序列化的对象是Django的模型类,DRF也为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类
  • 序列化器需要与视图一起使用,后续的文章我们会介绍更多类型的DRF视图类帮助我们快速的使用序列化器,而不需要书写过多的重复视图代码

区别与优点

ModelSerializer常规的Serializer相同,但提供了:

  • 基于Django模型类自动生成一系列字段
  • 基于Django模型类自动为序列化器生成validators
  • 包含默认的create() 创建方法update() 更新方法的实现

定义模型类序列化器

  • 为下述的django模型类创建一个模型类序列化器:
from django.db import models


# Create your models here.
class Students(models.Model):
    name = models.CharField(verbose_name='姓名', max_length=255)
    classmate = models.IntegerField(verbose_name='班级')
    studentID = models.IntegerField(verbose_name='学号')
    description = models.TextField(verbose_name='描述')

    class Meta:
        db_table = 'students'
  • 模型类序列化器如下:
class StudentModelSerializers(ModelSerializer):
    """学生信息模型序列化器"""

    class Meta:
        model = Students
        fields = '__all__'
  • model:是指对哪一个django模型类创建序列化器
  • fields:是指生成序列化器中包含模型类哪些字段,__all__是指为包含全部字段

查看生成的模型序列化器

  • 在这里我们使用的终端命令行操作,来查看生成的序列化器,并没有直接使用py文件的形式引入查看
  • 首先,打开终端,输入下述的命令,进入django的shell命令行:
    在这里插入图片描述
python manage.py shell

在这里插入图片描述

  • 导入我们自定义的StudentModelSerializers模型序列化器,并实例化,打印输出
    在这里插入图片描述

使用模型类序列化器

  • 我们直接使用前面的视图函数即可:
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import Students
from .serilizers import StudentsSerializers,StudentModelSerializers


class Students1Apiview(APIView):

    def get(self, request):
        # 获取数据集(学生模型对象)
        students_data = Students.objects.all()
        # 实例化序列化器,得到序列化器对象
        ser = StudentModelSerializers(instance=students_data, many=True)
        # 调用序列化器对象的data属性方法获取转换后的数据
        data = ser.data
        # 响应数据
        return Response(data)

    def post(self, request):
        # 反序列化数据
        student = StudentModelSerializers(data=request.data)
        # 校验不通过
        if not student.is_valid():
            # 返回错误信息
            return Response(student.errors)
        # 校验通过,保存数据
        student.save()
        # 响应数据
        return Response(student.data)


class StudentDerail1Apiview(APIView):
    # 获取一个学生的信息
    def get(self, request, pk):
        student = Students.objects.get(pk=pk)
        ser = StudentModelSerializers(instance=student)
        return Response(ser.data)

    # 修改一个学生的信息
    def put(self, request, pk):
        instance = Students.objects.get(pk=pk)
        ser = StudentModelSerializers(instance=instance, data=request.data)
        if not ser.is_valid():
            return Response(ser.errors)
        ser.save()
        return Response(ser.data)

    # 删除一个学生的信息
    def delete(self, request, pk):
        Students.objects.get(pk=pk).delete()
        return Response({'detail': '删除成功!!'})

  • 路由文件:
from django.urls import path, re_path

from . import views

urlpatterns = [
    # 基出序列化器
    # 多数据操作
    path('students/', views.StudentsApiview.as_view()),
    # 单个数据进行操作
    re_path('students/(?P<pk>\d+)/', views.StudentDerailApiview.as_view()),
    
    # 模型序列化器
    path('students1/', views.Students1Apiview.as_view()),
    re_path('students1/(?P<pk>\d+)/', views.StudentDerail1Apiview.as_view()),
]
  • 页面显示,与普通的序列化器定义的完全相同(查看全部数据):
    在这里插入图片描述

  • 查看单条数据在这里插入图片描述- 添加数据:在这里插入图片描述

  • 添加成功!!
    在这里插入图片描述

模型序列化器字段

  1. fields:使用fields字段来明确需要的模型字段,__all__表示包含所有模型字段,也可以写明具体哪些模型字段,如下:
fields = ['id', 'name', 'classmate']
  1. exclude:使用exclude字段表示:可以排除掉哪些模型字段,与上面的字段不能同时使用
exclude = ['description']
  1. read_only_fields:指明只读字段,即仅用于序列化输出时的字段
read_only_fields = ['id', 'name', 'studentID']
  1. extra_kwargs:使用extra_kwargs参数ModelSerializer添加或修改原有的选项参数
 extra_kwargs = {
     'name': {'required': True},
     'studentID': {'min_value': 41809010200, 'required': True},
 }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值