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

Posted 温柔且上进c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)相关的知识,希望对你有一定的参考价值。

模型类序列化器(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,
 

以上是关于python Django Rest_Framework框架 模型类序列化器(ModelSerializer)详解(图文并茂版)的主要内容,如果未能解决你的问题,请参考以下文章

python django怎么读

python的django工程可以用tomcat发布吗

python django能开发大型网站吗

python 中 django 的问题-------- 请高人指点 尽量详细点哦 初学django

Python-Django框架学习笔记——第二课:Django的搭建

如何在python文件中,引用django1.10的model