首页 > 其他分享 >使用drf的序列化类实现增删改查接口

使用drf的序列化类实现增删改查接口

时间:2023-04-03 14:56:36浏览次数:32  
标签:serializers name models 改查 book 序列化 data drf

目录

什么是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

报错如下:
image

全局钩子

  • 全局钩子只需要定义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

报错如下:
image

标签:serializers,name,models,改查,book,序列化,data,drf
From: https://www.cnblogs.com/smyz/p/17282721.html

相关文章

  • Java 序列化详解
    XML和JSON是两种经常在网络使用的数据表示格式,这里我们介绍如何使用Java读写XML和JSON。 一、XML概述1、XML简介我们都知道对象是不能在网络中直接传输的,不过还有补救的办法。XML(ExtensibleMarkupLanguage)可扩展标记语言,本身就被设计用来存储数据,任何一个对象都可以用XML来描......
  • Python ORM Pony 常用操作(增删改查)
    Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite,MySQL,PostgreSQL和Oracle等数据库,本文主要介绍PythonORMPony中常用操作,及数据增加、删除、修改和查询。......
  • 注解完成增删改查
    使用注解开发会比配置文件开发更加方便*查询:@Select*添加:@Insert*修改:@Update*删除:@Delete提示:注解完成简单功能配置文件完成复杂功能   ......
  • Go 连接数据库的增删改查
    packagemainimport("database/sql""fmt"_"github.com/go-sql-driver/mysql")vardb*sql.DBfuncinitDB()(errerror){dsn:="root:123456@tcp(127.0.0.1)/ssmd"db,err=sql.Open("mys......
  • 增删改查功能
          注意:如果openSession()没有指定开启自动事务,那么增删改功能需要手动提交事务,如果openSession(true),则不需要再手动commit()           ......
  • 项目一众筹网05_03_树的节点的增删改查、radio、代码里面实现模拟用户点击重置、每次
    系列文章目录文章目录系列文章目录18-添加子节点-目标和思路19-添加子节点-前端:打开模态框20-添加子节点-前端:发送Ajax请求==代码里面实现模拟用户点击重置==21-添加子节点-后端==bug发现异步的问题:每次加载数据的时候都要考虑一下异步的问题==22-更新节点-目标和思路23-更新节点......
  • 利用Jackson序列化实现数据脱敏
    作者:京东物流张晓旭1.背景在项目中有些敏感信息不能直接展示,比如客户手机号、身份证、车牌号等信息,展示时均需要进行数据脱敏,防止泄露客户隐私。脱敏即是对数据的部分信息用脱敏符号(*)处理。2.目标在服务端返回数据时,利用Jackson序列化完成数据脱敏,达到对敏感信息脱敏展示。降低重......
  • 缓冲流、序列化、转换流
    1.缓冲流昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些......
  • 调用post接口出现参数反序列化失败
    一、背景提供给其他产商一个post类型接口,参数类型是json入参如:{"name":"test2","age":17,"address":"四川成都","phone":"13281234456"}二、问......
  • hibernate的增删改查
    packagecom.endual.test;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importorg.hibernate.Query;importorg.hibernate.Sessi......