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. 12 Linux Which Command, Whatis Command, Whereis Command Examples

    This Linux tutorial will explain the three "W" commands. The three "W"s are what ...

  2. Grunt 入门操作指南

    0.简介 grunt是一个任务自动运行器.简单来讲,用了以后,再也不用每次修改sass后,去生成下css,也再也不用去一遍遍压缩js了 ,也再也不用修改了点点东西就要去刷新页面,也不需要去复杂地建立一 ...

  3. 一位ML工程师构建深度神经网络的实用技巧

    一位ML工程师构建深度神经网络的实用技巧 https://mp.weixin.qq.com/s/2gKYtona0Z6szsjaj8c9Vg 作者| Matt H/Daniel R 译者| 婉清 编辑 ...

  4. Java synchronized 线程同步

    同步方法 class MyTheard4 implements Runnable{ private int ticket; public MyTheard4(int ticket) { this.ti ...

  5. 2.Odoo产品分析 (一) – 一切为零

    查看Odoo产品分析系列--目录 1. 默认数据库 声明在先  本系列文档(Odoo产品分析)整理来自本人对该ERP的理解,并结合文档Working-with-Odoo-10-Second-Editi ...

  6. Python 标准类库-Windows特殊服务之msvcrt

    标准类库-Windows特殊服务之msvcrt   by:授客 QQ:1033553122 广告:出售自研自动化小平台(无需编码也可用),有需要请联系 测试环境 win7 64位 Python 3.4 ...

  7. Space Time Varying Color Palette

    PDF Space Time Varying Color Palettes from Bo Zhou

  8. Java map 详解

    Map 提供了一个更通用的元素存储方法.Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值. 初始化一个集合:  Map<String, String> map = ...

  9. SQL学习总结-思维导图

  10. git 入门教程之分支管理

    背景 什么是分支?简单地说,分支就是两个相对独立的时间线,正常情况下,独立的时间线永远不会有交集,彼此不知道对方的存在,只有特定情况下,两条时间线才会相遇,因为相遇,所以相知,因为相知,所以改变! 正 ...