DRF 一对多序列化与反序列化

DRF 一对多序列化与反序列化

  • 序列化

    出库的过程,是从数据库中把数据读出并以json的形式供前端使用

  • 反序列化

    入库的过程,是从前端将数据传入到views.py的函数或者类中,经过后台逻辑处理,最终写到数据库中。

  • 安装 djangorestframework

    pip install djangorestframework

  • 注册到INSTALL_APPS
    INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
  • 配置数据库
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'tutorial',
            'HOST': '127.0.0.1',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': 'ocnt-123',
            'OPTIONS':{
                    "init_command":"SET foreign_key_checks = 0;",# 禁用外键约束
            }
        }
    }
  • 新增老师类和学生类
from django.db import models

# 创建老师模型
class Teacher(models.Model):
    # 教师名称
    name = models.CharField(max_length=32,unique=True)
    # 添加时间
    addtime = models.DateTimeField(auto_now_add=True)

    class Meta:
        # 指定表名
        db_table = 'teacher'

# 创建学生模型,一个学生只能选择一个老师
class Student(models.Model):
    # 学生名称
    name = models.CharField(max_length=32,unique=True)
    # 添加时间
    addtime = models.DateTimeField(auto_now_add=True)
    # 外键 与Teacher类绑定
    teacher = models.ForeignKey('Teacher',on_delete=models.CASCADE)

    class Meta:
        # 指定表名
        db_table = 'student'
  • 新增视图函数类 TeacherView

    from rest_framework.views import  APIView
    from rest_framework.response import Response
    from .serializers import TeacherSerializer,StudentSerializer
    from . import models
    
    # 创建用户视图类
    class TeacherView(APIView):
        # 获取用户信息
        def get(self,request):
            data = models.Teacher.objects.all()
            info = TeacherSerializer(data,many=True)
            return Response({
                "status":200,
                "msg":"",
                "data":info.data
            })
    
        # 添加用户
        def post(self,request):
            data = request.data
            flag = models.Teacher.objects.create(**data)
            if not flag:
                return Response({"status":201,"msg":"添加数据失败","data":[]})
            return Response({"status":200,"msg":"","data":[]})
    
        # 编辑用户
        def put(self,request):
            id = request.data.pop("id")
            flag = models.Teacher.objects.filter(id=id).update(**request.data)
            if not flag:
                return Response({
                    "status":201,
                    "msg":"编辑失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"编辑成功",
                "data":""
            })
    
        # 删除用户
        def delete(self,request):
            id = request.data.pop('id')
            teacher = models.Teacher.objects.filter(id=id).delete()
            if not teacher[0]:
                return Response({
                    "status": 201,
                    "msg": "删除失败",
                    "data": []
                })
            return Response({
                "status": 200,
                "msg": "删除成功",
                "data": ""
            })
    
    • 新增视图函数类 StudentView
    # 学生视图
    class StudentView(APIView):
        # 获取数据
        def get(self,request):
            data = models.Student.objects.all()
            info = StudentSerializer(data,many=True)
    
            return Response({
                "status":200,
                "msg":"",
                "data":info.data
            })
    
        # 添加数据
        def post(self,request):
            data = request.data
            flag = models.Student.objects.create(**data)
            if not flag:
                return Response({
                    "status":201,
                    "msg":"学生添加失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"学生添加成功",
                "data":[]
            })
    
        # 编辑数据
        def put(self,request):
            id = request.data.pop('id')
            flag = models.Student.objects.filter(id=id).update(**request.data)
            if not flag:
                return Response({
                    "status":201,
                    "msg":"数据编辑失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"数据编辑成功",
                "data":[]
            })
    
        # 删除数据
        def delete(self,request):
            id = request.data.get('id')
            student = models.Student.objects.filter(id=id).delete()
            if not student[0]:
                return Response({
                    "status":201,
                    "msg":"删除失败",
                    "data":[]
                })
            return Response({
                "status":200,
                "msg":"删除成功",
                "data":[]
            })
    
  • 序列化类 serializers.py
    from rest_framework import serializers
    from . import models
    
    # 老师数据序列化
    class TeacherSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Teacher
            fields = '__all__'
    
    # 学生数据序列化
    class StudentSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Student
            fields = '__all__'
    
  • 二级路由 urls.py
    from django.urls import path
    from . import views
    urlpatterns = [
        path('teacher/',views.TeacherView.as_view()),
        path('student/',views.StudentView.as_view()),
    ]
  • 访问地址
    • GET http://127.0.0.1:8000/snippets/teacher/
    • POST http://127.0.0.1:8000/snippets/teacher/
    • PUT http://127.0.0.1:8000/snippets/teacher/
    • DELETE http://127.0.0.1:8000/snippets/teacher/
    • GET http://127.0.0.1:8000/snippets/student/
    • POST http://127.0.0.1:8000/snippets/student/
    • PUT http://127.0.0.1:8000/snippets/student/
    • DELETE http://127.0.0.1:8000/snippets/student/
  • 获取老师名下有多少个学生
    • serializers.py

      from rest_framework import serializers
      from . import models
      
      # 学生数据序列化
      class StudentSerializer(serializers.ModelSerializer):
          class Meta:
              model = models.Student
              fields = '__all__'
      
      # 老师数据序列化
      class TeacherSerializer(serializers.Serializer):
          id = serializers.IntegerField()
          name = serializers.CharField(max_length=32)
          student_set = StudentSerializer(many=True,read_only=True)
    • 调用此地址 GET http://127.0.0.1:8000/snippets/teacher/
  • 获取学生的老师是谁?
    • serializers.py

      from rest_framework import serializers
      from . import models
      
      # 学生数据序列化
      class StudentSerializer(serializers.ModelSerializer):
          teacherName = serializers.CharField(source='teacher.name')
          class Meta:
              model = models.Student
              fields = ('id','name','teacherName')
      
      # 老师数据序列化
      class TeacherSerializer(serializers.Serializer):
          id = serializers.IntegerField()
          name = serializers.CharField(max_length=32)
          student_set = StudentSerializer(many=True,read_only=True)
    • 调用此地址 GET http://127.0.0.1:8000/snippets/teacher/

原文地址:https://www.cnblogs.com/wuxiaoshi/p/11974279.html

时间: 2024-08-30 14:22:15

DRF 一对多序列化与反序列化的相关文章

DRF一对多序列化和反序列化

DRF一对多序列化和反序列化 models.py # 商品分类 class Category(models.Model): name = models.CharField(max_length=32) # 商品 class Goods(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=9,decimal_places=2) cate = models.Forei

DRF单表序列化和反序列化

安装 djangorestframework pip install djangorestframework 将rest_framework注册到app上 INSTALLED_APPS = [ 'rest_framework', 'app01' .... ] urls from django.urls import path from . import views urlpatterns = [ path('index/',views.UserView.as_view()) ] 在models.

DRF框架(三)——media资源路径设置、多表序列化(ModelSerializer)、多表反序列化、多表序列化与反序列化整合(重点)

media资源路径设置  (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 3.在urls.py路由设置 from django.views.static import serve from django.conf import settings urlpatterns =

drf序列化与反序列化

序列化器-Serializer 定义序列化器 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer. 例如,我们已有了一个数据库模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称') bpub_date = models.DateField(

内部类,drf响应类,序列化与反序列化

内部类 # 概念:将类定义在一个类的内部,被定义的类就是内部类 # 特点:内部类及内部类的所以名称空间,可以直接被外部类访问的 # 应用:通过内部类的名称空间,给外部类额外拓展一些特殊的属性(配置),典型的Meta内部类 - 配置类 class Book(model.Model): class Meta: db_model = "owen_book" # 配置自定义表名 class BookSerializer(serializers.ModelSerializer): class M

利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScriptSerializer进行JSON序列化 注意:    是复杂对象. JSON是Javascript中常用的数据格

go语言之行--文件操作、命令行参数、序列化与反序列化详解

一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: 标准输入 os.Stdout: 标准输出 os.Stderr: 标准错误输出 读写示例: package main import ( "fmt" "os" ) var( username,password string ) func main() { fmt.Prin

Python 解析模块 异常模块 响应模块 序列化和反序列化组件

解析模块(后端根据指定的解析规则来解析前端发来的数据) 为什么要配置解析模块 1)drf给我们通过了多种解析数据包方式的解析类 2)我们可以通过配置来控制前台提交的哪些格式的数据后台在解析,哪些数据不解析 3)全局配置就是针对每一个视图类,局部配置就是针对指定的视图来,让它们可以按照配置规则选择性解析数据 源码入口 # APIView类的dispatch方法中 request = self.initialize_request(request, *args, **kwargs) # 点进去 #

ModelSerializer 序列化和反序列化,及序列化整合

ModelSerializer 序列化序列化准备 - 模型层:models.pyfrom django.db import models # 1.基表模型类的封装(建立公有字段) class BaseModel(models.Model): is_delete = models.BooleanField(default=False) create_time = models.DateTimeField(auto_now_add=True) # 创建的时候更新时间 # 作为基表的model一定要加