使用drf的序列化类实现增删改查接口(代码片段)

smyz smyz     2023-04-03     627

关键词:

什么是DRF

drf全称:django rest framework,它可以帮助我们快速的实现符合restful规范的接口。

安装DRF

pip3 install djangorestframework
# 注意:如果django版本过低,安装完drf后,会被重装为最新版本,此时,再手工重新安装django即可。

基于原生创建五个接口

  • urls.py
from app01 import views

urlpatterns = [
    path(\'admin/\', admin.site.urls),
    path(\'api/v1/books/\', views.BookView.as_view()),
    path(\'api/v1/books/<int:pk>/\', views.BookDetailView.as_view()),
]
  • models.py
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)
  • views.py
from django import views
from app01 import models
from django.http import JsonResponse


# Create your views here.
class BookView(views.View):
    def get(self, request):
        # 查询出所有图书
        books = models.Book.objects.all()
        book_list = []

        for book in books:
            book_list.append(\'name\': book.name, \'price\': book.price, \'publish\': book.publish)
        return JsonResponse(book_list, safe=False)

    def post(self, request):
        # 获取前端传入的数据
        name = request.POST.get(\'name\')
        price = request.POST.get(\'price\')
        publish = request.POST.get(\'publish\')
        # 将数据写入到数据库
        book = models.Book.objects.create(name=name, price=price, publish=publish)
        # 返回给前端新增的对象
        return JsonResponse(\'name\': book.name, \'price\': book.price, \'publish\': book.publish)


class BookDetailView(views.View):
    # 查询一条数据
    def get(self, request, pk):
        book = models.Book.objects.filter(pk=pk).first()
        return JsonResponse(\'id\': book.pk, \'name\': book.name, \'price\': book.price, \'publish\': book.publish)
    # 修改一条数据
    def post(self, request, pk):
        # 找到要修改的数据
        book = models.Book.objects.filter(pk=pk).first()
        # 获取前端传入的数据,进行修改
        book.name = request.POST.get(\'name\')
        book.price = request.POST.get(\'price\')
        book.publish = request.POST.get(\'publish\')
        book.save()
        # 返回给前端修改后的数据
        return JsonResponse(\'id\': book.pk, \'name\': book.name, \'price\': book.price, \'publish\': book.publish)

    # 删除一条
    def delete(self, request, pk):
        book = models.Book.objects.filter(pk=pk).delete()
        return JsonResponse(data=\'\')

基于rest_framework的增删改查

查询多条数据

流程

  1. 需要在models.py创建测试使用的表
  2. 要使用rest_framework的serializers,需要先在应用中创建serializer.py(名字随意起),并在里面创建序列化类,有点类似于django的form组件。
  3. 在views中引入创建的serialzer中的序列化类,在创建类的时候使用

创建表

  • models.py
# 创建表
from django.db import models


# Create your models here.
class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.CharField(max_length=32)

创建序列化类

  • serializer.py
from rest_framework import serializers
from app01 import models


class BookSerializer(serializers.Serializer):
    # 序列化某些字段(内容写要序列化的字段)
    name = serializers.CharField()
    price = serializers.CharField()
    publish = serializers.CharField()

创建视图类

  • views.py
from app01 import models
from app01.serializer.serializer import BookSerializer
from rest_framework.views import APIView, Response
class BookView(APIView):
    # 查询多条数据
    def get(self, request):
        books = models.Book.objects.all()
        # instance是要序列化的对象  # many参数默认为None,如果返回结果是queryset,就需要指定many=True
        ser = BookSerializer(instance=books, many=True)
        return Response(ser.data)

增加路由

  • urls.py
path(\'api/v1/books/\', views.BookView.as_view()),

查询单条数据

序列化类不变

  • serializer.py
from rest_framework import serializers
from app01 import models


class BookSerializer(serializers.Serializer):
    # 序列化某些字段(内容写要序列化的字段)
    name = serializers.CharField()
    price = serializers.CharField()
    publish = serializers.CharField()

视图类定义对象

  • views.py
class BookDetailView(APIView):
    # 序列化单条数据
    def get(self, request, *args, **kwargs):
        # 根据传入的数据,进行筛选
        book = models.Book.objects.filter(pk=kwargs.get(\'pk\')).first()
        # 序列化
        ser = BookSerializer(instance=book)
        return Response(ser.data)

新增路由

  • urls.py
path(\'api/v1/books/<int:pk>/\', views.BookDetailView.as_view()),

新增一条数据

序列化类

  • 新增一条数据,需要在序列化类中定义create方法
  • serializer.py
class BookSerializer(serializers.Serializer):
    # 序列化某些字段(内容写要序列化的字段)
    name = serializers.CharField()
    price = serializers.CharField()
    publish = serializers.CharField()
    # 新增一条数据,需要在序列化类中定义create方法
    def create(self, validated_data):
        book = models.Book.objects.create(**validated_data)
        return book

视图类

  • views.py
class BookView(APIView):
    # 新增一条数据
    def post(self, request):
        # 把前端传入的要保存的数据,传给data参数
        ser = BookSerializer(data=request.data)
        # 校验数据
        if ser.is_valid():
            # 如果校验通过,则保存数据
            # 如果要保存数据,需要在序列化类中增加create方法
            ser.save()
            return Response(\'code\': 100, \'msg\': \'新增成功\', \'result\': ser.data)
        else:
            return Response(\'code\': 101, \'msg\': ser.errors)

修改一条数据

  • 修改一条数据,需要在序列化类中定义update方法
  • serializer.py
class BookSerializer(serializers.Serializer):
    # 序列化某些字段(内容写要序列化的字段)
    name = serializers.CharField()
    price = serializers.CharField()
    publish = serializers.CharField()

    def update(self, instance, validated_data):
        # instance是要修改的对象
        # validated_data是校验过后的数据
        instance.name = validated_data.get(\'name\')
        instance.price = validated_data.get(\'price\')
        instance.publish = validated_data.get(\'publish\')
        # 保存修改的数据
        instance.save()
        # 返回修改后的数据
        return instance

视图类

  • views.py
class BookDetailView(APIView):
    # 反序列化  修改数据
    def put(self, request, pk):
        book = models.Book.objects.filter(pk=pk).first()
        # 使用data接收前端传过来的数据,使用instance指定要修改哪个
        ser = BookSerializer(data=request.data, instance=book)
        if ser.is_valid():
            ser.save()
            return Response(\'code\': 100, \'msg\': \'修改成功\', \'result\': ser.data)
        else:
            return Response(\'code\': 101, \'msg\': ser.errors)

删除一条数据

  • 删除数据只需要在视图类中定义即可
  • views.py
class BookDetailView(APIView):
    def delete(self, request, pk):
        models.Book.objects.filter(pk=pk).delete()
        return Response(\'code\': 100, \'msg\': \'删除成功\')

序列化之钩子函数校验

局部钩子

  • 需要导入ValidationError方法
  • 只需要定义以 “validate_字段名” 命名的函数即可,如下
from rest_framework import serializers
from app01 import models
from rest_framework.exceptions import ValidationError

class BookSerializer(serializers.Serializer):
    # 序列化某些字段(内容写要序列化的字段)
    name = serializers.CharField()
    price = serializers.CharField()
    publish = serializers.CharField()

    def create(self, validated_data):
        book = models.Book.objects.create(**validated_data)
        return book

    def update(self, instance, validated_data):
        # instance是要修改的对象
        # validated_data是校验过后的数据
        instance.name = validated_data.get(\'name\')
        instance.price = validated_data.get(\'price\')
        instance.publish = validated_data.get(\'publish\')
        # 保存修改的数据
        instance.save()
        # 返回修改后的数据
        return instance

    # 局部钩子
    def validate_name(self, name):
        # 校验name是否合法,比如name不能等于123
        if name == \'123\':
            # 校验不合法,直接抛异常
            raise ValidationError(\'不可以为123\')
        else:
            return name

报错如下:

全局钩子

  • 全局钩子只需要定义validate函数即可,如下
from rest_framework import serializers
from app01 import models
from rest_framework.exceptions import ValidationError

class BookSerializer(serializers.Serializer):
    # 序列化某些字段(内容写要序列化的字段)
    name = serializers.CharField()
    price = serializers.CharField()
    publish = serializers.CharField()

    def create(self, validated_data):
        book = models.Book.objects.create(**validated_data)
        return book

    def update(self, instance, validated_data):
        # instance是要修改的对象
        # validated_data是校验过后的数据
        instance.name = validated_data.get(\'name\')
        instance.price = validated_data.get(\'price\')
        instance.publish = validated_data.get(\'publish\')
        # 保存修改的数据
        instance.save()
        # 返回修改后的数据
        return instance

    # 局部钩子
    def validate_name(self, name):
        # 校验name是否合法,比如name不能等于123
        if name == \'123\':
            # 校验不合法
            raise ValidationError(\'不可以为123\')
        else:
            return name

    # 全局钩子
    def validate(self, attrs):
        # 校验数据,出版社不能为“我是出版社”
        if attrs.get(\'publish\') == \'我是出版社\':
            raise ValidationError(\'出版社不可以为“我是出版社”\')
        else:
            return attrs

报错如下:

使用dbutils实现增删改查——resultsethandler接口的实现类

    在上一篇文章中《使用DbUtils实现增删改查》,发现运行runner.query()这行代码时。须要自己去处理查询到的结果集,比較麻烦。这行代码的原型是:publicObjectquery(Connectionconn,Stringsql,ResultSetHandler<T>rsh,Object...par... 查看详情

restframework(drf)框架初探以及认识serializers序列化器的增删改查(代码片段)

...户的增删改查1.创建app2.定义数据模型并同步数据库3.编写序列化器文件4.编写视图5.添加api路由1.1修改settings.py文件1.2创建一个apppython3manage.pystartappmyapp_api1.3定义数据模型并同步(models.py)fromdjango.dbimportmodels#Createyourmodelshere.classUser(m... 查看详情

动态实现类(对数据库的增删改查)(代码片段)

...库进行操作时,通常会定义一个接口类,然后定义很多的实现类来实现这个接口的所有方法,这样就会产生很多的实现类出来,增加了代码的冗余度,所以我们可以通过动态代理模式来动态生成实现类来代替所有的实现类,再通... 查看详情

drf视图(代码片段)

目录开始使用内置视图请结合【DRF序列化】此文献中的数据文件及序列化文件来阅读如下代码.DRF视图为我们提供了非常简便的方法——内置了增删改查等一系列的操作.我们只需在url中指定对应的方法,视图继承内置方法的类,... 查看详情

maven+mybatis实现数据库增删改查(代码片段)

Maven+Mybatis实现数据库增删改查1.新建一个普通的Maven项目,在pom.xml导入maven依赖。2.创建一个模块在mybatis-config.xml编写mybatis的核心配置文件3.编写mybatis工具类4.编写代码:实体类5.编写代码:dao接口6.编写代码:... 查看详情

详细解析javajdbc实现增删改查(代码片段)

目录实现java数据库的增删改查基本步骤包与类的结构。一,与数据库建立连接,驱动包导入。​二,创建实体类(与数据库的属性相一致)三,创建接口 四,sql语句预编译和执行代码         五&... 查看详情

mybatis增删改查

Author:Marydon   声明:使用mybatis,本身不需要再写dao的实现类,此处为了保持三层架构的完整性,遂添加了接口dao的实现类 1.增加   sql语句-->有默认返回类型,一般是int(表示影响行数的意思)<!--新增班级--><insertid="add... 查看详情

drf框架之视图的扩展类简介(代码片段)

...义API‘‘‘#1.设置查询集queryset=BookInfo.objects.all()#2.设置序列化器serializer_class=BookInfoModelSerializer#请求方法1.ListModelMixin扩展类ListModelMixin扩展类,为我们提供了一个list方法,实现了查询所有信息的功能,并返回JSON数据。源代码:c... 查看详情

go使用gin+redis实现增删改查(代码片段)

Go使用Gin+Redis实现增删改查0.前置知识Go中的struct。Redis、Gin框架。Web基础。1.架构使用Redis作为数据库,Gin作为Web框架。2.功能模块1.自定义Person结构体2.实现对Person的增删改查。根据id查询或查询所有插入修改删除3.实现流... 查看详情

权限组件(代码片段)

目录权限组件系统权限类使用权限组件项目使用:VIP用户权限特殊路由映射的请求权限组件重点1权限规则2如何自定义权限3我们一般在视图类中局部配置drf提供的权限类,但是也会自定义权限类完成局部配置自定义权限类1自定... 查看详情

drf学习(代码片段)

...解析模块、渲染模块、响应模块、异常模块4.drf核心组件序列化组件:将后台的任何数据,进行序列化返回给前台;将前台的数据反序列化后台model对象再入库。5.群查接口相关组件:搜索、筛选、排序、分页目的:掌握六大基础... 查看详情

mybatis实现增删改查(crud)(代码片段)

...件第六步:编写测试类mybatis创建过程二、基于代理Dao实现CRUD操作1、编写测试类/***@authorGaoYang*@C 查看详情

django功能七(代码片段)

...数据编码格式ajax发送json格式数据ajax发送文件django自带的序列化功能(了解,后面将路飞会将更加牛逼的序列化drf)ajax结合sweetalert实现删除按钮的二次确认操作今日内容详细图书管理的图书增删改查fromdjango.short 查看详情

mybatis:实现“增删改查”(代码片段)

...类型的参数3、map集合类型的参数4、实体类类型的参数5、使用@Param标识参数6、结论三、MyBatis的各种查询功能1、查询一个实体类对象2、查询一个list集合3、查询单个数据4、查询一条数据为map集合5、查询多条数据为map集合6、... 查看详情

23.orm系统实现对数据库中数据的增删改查(代码片段)

使用Django中的ORM系统实现对数据库中数据的增删改查!(1)数据的增删改查----------增加数据!在视图函数中导入User模型类,然后使用下面的方法添加数据:fromdjango.httpimportHttpResponsefrom.modelsimportUser#Createyourviews... 查看详情

23.orm系统实现对数据库中数据的增删改查(代码片段)

使用Django中的ORM系统实现对数据库中数据的增删改查!(1)数据的增删改查----------增加数据!在视图函数中导入User模型类,然后使用下面的方法添加数据:fromdjango.httpimportHttpResponsefrom.modelsimportUser#Createyourviews... 查看详情

单链表的创建和增删改查实现(代码片段)

文章目录节点类的定义单链表类按照顺序向单链表中添加元素对节点信息进行修改对节点进行删除节点类的定义/**节点类,用来定义结点的信息和引用**/classHero_Nodeprivateintno;privateStringname;privateStringHname;Hero_NodeNext_hero;publicHero_... 查看详情

jdbc_增删改查(代码片段)

...即可)2.3. 获取数据库连接(分解注释)2.4. 使用PreparedStatement实现CRUD操作三、JDBC程序编写(使用PreparedStatement实现查询操作)1、通用的查询方法(调用即可)2、ResultSet与ResultSetMetaData(结果集... 查看详情