Django接口实现 DRF

使用 以下模块 实现 json数据 序列化

博客: https://www.cnblogs.com/liwenzhou/p/9959979.html

Django REST Framework

​ 查看全局的 DRF 配置: rest_framework.settings

  • 基于Django开发RESTful API的一个框架
  • django 中使用
  1. 安装模块

    pip install djangorestframework

  2. 使用的时候

    使用 rest_framework 这个名字

Serializer 使用

  • 以图书管理为基础 操作

    • Books 图书
    • Author 作者
    • Publisher 出版社
  1. 注册APP 'rest_framework', 不是必须的 需要好看的界面 就注册

  2. 在views 视图中 使用

    CBV写法:

    1. 导入APIView from rest_framewor.views import APIView, CBV继承它

    2. 响应对象 使用 rest_framework 中的 响应 Response

      from rest_framework.response import Response

    3. 在app中 创建一个 serializers 的 py文件 创建 序列化工具类 并将其导入 用法 跟Form 基本类似

      from interface.serializers import BooksSerializer

    CBV视图中注意事项:

    • 写上类注释 会在 chream 浏览器中 提示 相当于 文档提示

    • 实例化的 serializer 对象 接收 参数

      BooksModelSerializer(query_set_list, many=True)

      BooksSerializer(instance=book_obj)

      BooksSerializer(instance=book_obj, data=request.data, partial=False)

      queryset对象直接放在第一个位置 交给 工具序列化 many=True 需要有多个会循环读取

      instance 需要单个的书籍对象 data=需要校验的数据 partial=False 可以对单个值进行修改

    • 返回的 数据 ser_obj.data 就是序列化的 json 数据 APIView 包装的 数据 直接用 Reaponse 返回

    • 提交修改的数据put数据 request.data

    • 路由上携带的 参数 request.query_params

    • request 不是之前的 request 对象 self._requrst 才是之前的 request

    • 使用 res_obj.save() 需要在 serializer 中 重写 create() 方法

    • 修改数据时 错误信息 是 ser_obj.errors 直接返回

    class BooksList(APIView):
    ''' books书籍 接口 :支持查询所有书籍 GET请求 添加书籍 POST请求 '''
    def get(self, request):
    '''获取所有的书籍'''
    query_set_list = models.Books.objects.all()
    ser_obj = BooksModelSerializer(query_set_list, many=True)
    return Response(ser_obj.data) def post(self, request):
    # 将 数据交给 serializer books序列化的 工具进行效验
    ser_obj = BooksSerializer(data=request.data)
    print(request.data)
    if ser_obj.is_valid():
    # serializer 中 调用 save() 方法 需要 重写 create() 方法
    ser_obj.save()
    return Response('ok')
    else:
    return Response(ser_obj.errors) class BookDetails(APIView):
    ''' 单本书籍的操作 支持 GET/PUT/DELETE '''
    def get(self, request, pk):
    '''单本书籍的查询'''
    book_obj = models.Books.objects.filter(pk=pk).first()
    if book_obj:
    ser_obj = BooksSerializer(instance=book_obj)
    return Response(ser_obj.data) def put(self, request, pk):
    '''单本书籍的修改'''
    book_obj = models.Books.objects.filter(pk=pk).first()
    if book_obj:
    # partial=True 可以局部更新
    ser_obj = BooksSerializer(instance=book_obj, data=request.data, partial=False)
    if ser_obj.is_valid():
    ser_obj.save() # 调用 类中的update() 方法
    return Response(ser_obj.data)
    else:
    return Response(ser_obj.errors) def delete(self, request, pk):
    '''删除某一本书籍'''
    book_queryset = models.Books.objects.filter(pk=pk)
    if book_queryset:
    book_queryset.delete()
    return Response('删除成功!!')
  3. 自己写一个序列化的工具类 BookSerializer

    工具类写法:

    • 导入 serializers

      from rest_framework import serializers

    • 创建类 继承 serializers.Serializer

    • 填写 需要序列化的 字段

    • 重写 create(self,validated_data) 方法 以及 update(self, instance, validated_data):方法

      validates_date 就是通过校验的数据 instance 是 单个的 数据对象

    • 局部钩子 def validate_字段名(self, attrs): 全局钩子 :def validate(self, attrs):

    注意事项:

    • id字段 需要填写 参数required=False 修改此字段在新建数据时不是必须的 可以不写
    • 字段名要跟models 中的字段名对应
    • 字段参数使用 serializers.字段类型 进行设置 参数填写 max_length=32...等参数进行效验

特殊字段的 显示

  • 写两个字段 一个用来读取 一个用来添加 使用 read_only=Truewrite_only=True区分
  1. choices 显示

    参数cource='get_字段名_display'来显示具体对应的 内容

  2. ForeignKey 显示

    自定义一个对应的 外键 序列化类 进行显示

  3. ManTOMan 字段显示

    多个内容 使用 many=true 的参数 来取多个值 同样创建一个字段对应的序列化类

写入效验的 字段 变量面前需要加 post_字段名来区分 写入时字段名要对应

  • create() 中就是 orm 操作 validated_data 就是通过效验的数据

    注意字段中存的 具体数据类型

    需要返回 创建好的 obj 的对象

  • update() 中也是 orm 操作 instance 就是要修改的 单本书的数据 validated_data通过校验的数据

    需要返回 instence

  • 钩子中 不通过效验 需要抛出 serializers 中的 ValidationError

    raise serializers.ValidationError('不通过效验 就抛出异常')

'''
这是一个 Django rest framework 的 json 序列化的 工具
'''
from rest_framework import serializers
from interface import models class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
name = serializers.CharField(max_length=32) class PublisherSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
name = serializers.CharField(max_length=32) class BooksSerializer(serializers.Serializer):
# 普通字段的 显示
id = serializers.IntegerField(required=False)
# validators 自定义效验规则
title = serializers.CharField(max_length=32,validators=[func])
pub_date = serializers.DateField(required=False) # choices 字段 特殊显示
booksType = serializers.CharField(source='get_booksType_display', read_only=True)
post_booksType = serializers.IntegerField(write_only=True) # ForeignKey 字段特殊显示
publisher = PublisherSerializer(read_only=True)
post_publisher = serializers.IntegerField(write_only=True) # ManyToManyField 字段特殊显示
authors = AuthorSerializer(many=True, read_only=True)
post_authors = serializers.ListField(write_only=True) def validate(self, attrs):
'''全局 校验 '''
return attrs def validate_title(self, attrs):
''' 单一字段的校验 '''
if "av" in attrs:
raise serializers.ValidationError('不通过效验 就抛出异常')
return attrs # 行内校验:
# 自定义函数 给出字段参数 validators=[func] def create(self, validated_data):
'''重写 create() 方法 使用 save() 方法 写入数据库'''
# validated_data 就是通过效验的数据
print(validated_data)
# 正常字段 以及外键的创建
book_obj = models.Books.objects.create(
title=validated_data['title'],
booksType=validated_data['post_booksType'],
publisher_id=validated_data['post_publisher'],
)
# 多对多的创建
book_obj.authors.set(validated_data['post_authors'])
return book_obj def update(self, instance, validated_data):
# print(instance) # 要更新的 book 对象
# print(validated_data) # 通过校验的数据
instance.title = validated_data.get('title', instance.title)
instance.booksType = validated_data.get('post_booksType', instance.booksType)
instance.publisher_id = validated_data.get('post_publisher', instance.publisher_id)
# 将表内的数据存入数据库中
instance.save()
# 修改 多对多字段
instance.authors.set(validated_data.get('post_authors', [i['id'] for i in instance.authors.all().values('id')])) return instance
  1. 在视图中 使用queryset数据实例化得到一个 序列化对象 --》 ser_obj 并返回数据

    ser_obj = BooksSerializer(instance=book_obj)
    return Response(ser_obj.data)

Django-rest-framework 接口实现 Serializer 使用的更多相关文章

  1. Django REST Framework 学习笔记

    前言: 基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无 ...

  2. Django REST framework的使用简单介绍

    官方文档:https://www.django-rest-framework.org/ GitHub源码:https://github.com/encode/django-rest-framework ...

  3. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  4. Django Rest framework基础使用之 serializer

    rest-framework文档地址:http://www.django-rest-framework.org/ Django Rest framework是一个非常强大且灵活的工具包,用于构建web ...

  5. Django Rest Framework Serializer的简单使用

    1.RESTful 1.1 定义 REST(Representational State Transfer)与技术无关,代表一种软件架构风格,中文为表征状态转移. 1.2 RESTful API设计 ...

  6. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  7. [Django REST framework - 自动生成接口文档、分页]

    [Django REST framework - 自动生成接口文档.分页] 自动生成接口文档 # 后端人员写好接口,编写接口文档,给前端人员看,前端人员依照接口文档开发 # 公司里主流 -后端,使用w ...

  8. Django REST framework serializer 嵌套显示绝对路径

    在 Django REST framework官方文档提到,当调用Serializer时,应当传入request参数,以便生成完整的url而不是相对url.使用ModelSerializer时requ ...

  9. Django REST Framework(一) Serializer和ModelSerializer

    REST Framework概述 Django REST framework是一套基于Django的REST框架,是一个用于构建Web API的功能强大且灵活的工具包. 1.RESTful 简述Rep ...

  10. Django REST framework 的TokenAuth认证及外键Serializer基本实现

    一,Models.py中,ForeignKey记得要有related_name属性,已实现关联对象反向引用. app_name = models.ForeignKey("cmdb.App&q ...

随机推荐

  1. 深度解析XML的结构与类映射

    XML概述      可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自 ...

  2. async,await,Task 的一些用法

    async,await,Task 的一些用法 private void Form1_Load(object sender, EventArgs e) { Display(); } public asy ...

  3. 如何理解php的依赖注入

    之前写过关于php依赖注入的文章..最近发现有的朋友对这个还是理解模糊,在这里我想写个简单的实例帮助朋友们理解下...传统的思路是应用程序用到一个A类,就会创建A类并调用A类的方法,假如这个方法内需要 ...

  4. 【Java每日一题】20170320

    20170317问题解析请点击今日问题下方的“[Java每日一题]20170320”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  5. Netty 系列二(传输).

    一.前言 上一篇文章我们提到 Netty 的核心组件是 Channel.回调.Future.ChannelHandler.EventLoop,这篇文章主要是对 Channel (Netty传入和传出数 ...

  6. CentOS 7.0 下 Python 2.7 升级到 Python 3.5

    前段因为时间工作需要,要把 Centos 7.0 默认安装的 Python 2.7 升级到 Python 3.5. 具体操作如下: # 安装 gcc gcc-c++ 等编译工具软件 yum insta ...

  7. CSS效果:CSS3实现模拟select以及其中的三角形

    如图实现这样的效果: html代码如下: <div class="select-bg"> <select class="select-green&quo ...

  8. GitHub for Windows离线安装包

    国内安装github客户端,真的很痛!! 偶然找到了离线安装包,感谢作者的资源分享!!! 地址:http://download.csdn.net/download/lyg468088/8723039? ...

  9. 一个JVM进程启动后里面有几个线程

    在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序.但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程 ...

  10. 利用SurfaceView显示正弦曲线,仿造示波器

    众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...