DRF中的request

在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。

比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据。

在APIView中封装的request,就实现了请求数据的解析:

对于GET请求的参数我们通过request.query_params来获取。

对于POST请求、PUT请求的数据我们通过request.data来获取。

视图的使用:

1 前提之序列化

# 首先需要在setting中注册rest_framework的中间件

from rest_framework import serializers
from crm import models class PublisherModel(serializers.ModelSerializer):
class Meta:
model =models.Publisher
fields = '__all__' class AuthorModel(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = '__all__' class BookSerializers(serializers.Serializer):
id = serializers.IntegerField(required=False)
name = serializers.CharField(max_length=32)
pub_date = serializers.DateField() CHOICES = ((1, 'python'), (2, 'go语言'), (3, 'linux'))
# source设置数据读取时候读取到 CHOICES里面的内容,read_only设置只在读取时有效
category = serializers.CharField(source='get_category_display',read_only=True)
post_category = serializers.IntegerField(write_only=True) # 对出版社字段进行校验 读取时,和设置是显示的格式不同
publisher = PublisherSerializers(read_only=True)
post_publisher = serializers.IntegerField(write_only=True) # 对作者字段进行校验
author = AuthorSerializers(many=True, read_only=True)
post_author = serializers.ListField(write_only=True) # create方法相当于对每个通过校验的字段进行获取在数据库中新建保存
def create(self, validated_data): # validated_data里面保存的是校验通过后的数据
book_obj = models.Book.objects.create(
name=validated_data["name"],
pub_date=validated_data["pub_date"],
category=validated_data["post_category"],
publisher_id=validated_data["post_publisher"]
)
book_obj.author.set(validated_data["post_author"]) # 多对多字段需要重新设置关系
return book_obj def update(self, instance, validated_data):
# 从validated_data中取出数据挨个字段更新
instance.name = validated_data.get('name', instance.name)
instance.pub_date = validated_data.get('pub_date', instance.pub_date)
instance.category = validated_data.get('post_category', instance.category)
instance.publisher_id = validated_data.get('post_publisher', instance.publisher_id)
instance.save()
# 更新多对多字段的 authors
# 先取出当前书籍的所有作者id
author_list = instance.author.all().values_list('id') # [(1,),(2,)] ==> [1, 2] instance.author.set(validated_data.get('post_authors', [i[0] for i in author_list]))
return instance

serializers

2 初级阶段

from rest_framework.response import Response
from rest_framework.views import APIView # 图书的展示以及添加
class Book(APIView): # 继承改为restframework的封装的APIView
def get(self, request):
# 1,在后端获取数据
book_obj = models.Book.objects.all()
# 2,使用seriallizers进行数据格式化
ser_obj = BookSerializers(book_obj, many=True)
# 返回给前端 Response方法是serializers封装的方法
return Response(ser_obj.data) def post(self, request):
# 1, 在前端获取提交的数据
# 此时的request已经是被serializers封装过的request,不是简单的页面提交的那个request
# 前端提交的数据存在request.data里面 print(request.data)
# 2, 进行serializers校验
ser_obj = BookSerializers(data=request.data)
if ser_obj.is_valid(): # 如果通过了校验
print("oye")
# 数据校验通过以后,想要使用save方法保存的话,需要调用BookSerializers里面的create方法
ser_obj.save()
return Response('数据添加成功!')
else: # 没通过校验的数据,返回错误信息
print('ono')
return Response(ser_obj.errors) # 具体图书信息的展示以及修改和删除
class BookDetail(APIView): def get(self, request, pk):
book_obj = models.Book.objects.filter(pk=pk).first() if book_obj:
ser_obj = BookModel(book_obj) # 对数据进行有效性校验
return Response(ser_obj.data)
else:
return Response('无效的id') def put(self, request, pk):
book_obj = models.Book.objects.filter(pk=pk).first()
if book_obj:
ser_obj = BookSerializers(instance=book_obj, data=request.data, partial=True) # 此处得到request已经是封装过的,partial表示局部更新
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
else:
return Response(ser_obj.errors)
else:
return Response('无效的id') def delete(self,request,pk):
book_obj = models.Book.objects.filter(pk=pk).first()
if book_obj:
book_obj.delete()
return Response("删除成功")
else:
return Response("无效的id")

3 强化版

from django.contrib import admin
from django.urls import path,re_path
from crm import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', views.Book.as_view()),
re_path('book/(?P<pk>\d+)/$', views.BookDetail.as_view()), path('author/', views.Authorshow.as_view()),
re_path('author/(?P<pk>\d+)/$', views.AuthorDetail.as_view()), path('publisher/', views.Publishershow.as_view()),
re_path('publisher/(?P<pk>\d+)', views.PublisherDetail.as_view()), ]

路由

# 公共类,获取数据使用
class GerneridView(APIView):
queryset = None
serializer_class = None def get_queryset(self):
queryset = self.queryset.all() # 刷新数据
return queryset def get_object(self, request, pk, *args, **kwargs):
queryset = self.queryset.filter(pk=pk).first()
return queryset class ListMixin(object):
def get(self, request):
queryset = self.get_queryset()
ser_obj = self.serializer_class(queryset, many=True)
return Response(ser_obj.data) class CreateMixin(object):
def post(self, request):
ser_obj = self.serializer_class(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response('OK')
else:
return Response(ser_obj.errors) class ActreveMixin(object):
def get(self, request, pk, *args, **kwargs):
obj = self.get_object(request, pk, *args, **kwargs)
if obj:
ser_obj = self.serializer_class(obj)
return Response(ser_obj.data)
else:
return Response("无效的id") class UpdateMixin(object):
def put(self, request, pk, *args, **kwargs):
book_obj = self.get_object(request, pk, *args, **kwargs)
if book_obj:
ser_obj = AuthorModel(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response("数据更新成功")
else:
return Response(ser_obj.errors)
else:
return Response("无效的id") class DelMixin(object):
def delete(self,request, pk, *args, **kwargs):
obj = self.get_object(request, pk, *args, **kwargs)
if obj:
obj.delete()
return Response('删除成功')
else:
return Response("无效的id") class Authorshow(GerneridView, ListMixin, CreateMixin):
queryset = models.Author.objects.all()
serializer_class = AuthorModel class AuthorDetail(GerneridView, ActreveMixin, UpdateMixin, DelMixin):
queryset =models.Author.objects.all()
serializer_class = AuthorModel

面向对象封装版

4 究极进化版

from django.urls import path,re_path
from bms import views
urlpatterns = [
path('admin/', admin.site.urls), # 作者相关操作
path('author/', views.AuthorShow.as_view(actions={'get': 'list', 'post': 'create'})),
re_path('author/(?P<pk>\d+)/$', views.AuthorShow.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), # 出版社相关操作
path('publisher/', views.PublisherShow.as_view(actions={'get': 'list', 'post': 'create'})),
re_path('publisher/(?P<pk>\d+)/$', views.PublisherShow.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), # 图书相关增删改查操作
path('books/', views.BooksShow.as_view(actions={'get': 'list', 'post': 'create'})),
re_path('books/(?P<pk>\d+)/$', views.BooksShow.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), ]

路由

from bms import models
# Create your views here.
from rest_framework.viewsets import ModelViewSet
from bms.serializer import AuthorModel, PublisherModel, BookModel class AuthorShow(ModelViewSet):
queryset = models.Author.objects.all()
serializer_class = AuthorModel class PublisherShow(ModelViewSet):
queryset = models.Publisher.objects.all()
serializer_class = PublisherModel class BooksShow(ModelViewSet):
queryset = models.Book.objects.all()
serializers = BookModel

究极进化版

5 无比强大的路由

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'school', views.SchoolView)
urlpatterns += router.urls

6 一张不明觉厉的图

DjangoRESTFrameWork中的视图的更多相关文章

  1. (转) PowerDesigner中Table视图同时显示Code和Name

    PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果: 实现方法:Tools-Display Preference

  2. postgres中的视图和物化视图

    视图和物化视图区别 postgres中的视图和mysql中的视图是一样的,在查询的时候进行扫描子表的操作,而物化视图则是实实在在地将数据存成一张表.说说版本,物化视图是在9.3 之后才有的逻辑. 比较 ...

  3. 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能

    在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...

  4. Tips7:Unity中 Scene视图 和 Game视图 中 视角(Camera)的控制

    选中你要改变的相机,然后点击GameObject-->Align With View 选项(快捷键Ctrl+Shift+F)使相机视角和当前Sence视图中一样 通过这样可以控制在Game视图( ...

  5. Mysql中的视图

    什么是视图 通俗的讲,视图就是一条SELECT语句执行后返回的结果集.所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 视图的特性 视图是对若干张基本表的引用,一张虚表,查询语句执 ...

  6. .NET中的视图和过滤器 (DefaultView和RowFilter)

    NET中的视图和过滤器 (DefaultView和RowFilter) ADO.NET中有一层对象,用来创建任意数据源的抽象模型.其中包括DataSet,DataTable,DataRow,DataV ...

  7. SQLServer中在视图上使用索引(转载)

    在SQL Server中,视图是一个保存的T-SQL查询.视图定义由SQL Server保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全.但是,它并不占用数据库的任何空间.实际上,在你 ...

  8. ThinkPHP中的视图二

    ThinkPHP中的视图 1.模板注释 在实际项目开发中,经常要使用注释功能,如果是ThinkPHP框架,则可以在模板文件中使用如下方式进行注释: {// 注释内容 } :单行注释 {/* 注释内容 ...

  9. ThinkPHP中的视图

    ThinkPHP中的视图View 1.什么是视图View 所谓的视图就是用户可视化操作界面. 2.视图View组成 view类(模板引擎类似Smarty) 模板文件(html模板) 3.视图的定义 默 ...

随机推荐

  1. Python 最常见的 170 道面试题全解析:2019 版

    Python 最常见的 170 道面试题全解析:2019 版 引言 最近在刷面试题,所以需要看大量的 Python 相关的面试题,从大量的题目中总结了很多的知识,同时也对一些题目进行拓展了,但是在看了 ...

  2. 7.jQuery之显示与隐藏效果

    这里用到三个函数方法:show()   hide()  toggle() 注意点是三个方法里面的两个参数的使用,前一个参数是时间,表示显示速度:后一个参数是回调函数,只有前面的动画执行完之后,回调函数 ...

  3. 企业面试题|最常问的MySQL面试题集合(一)

    问题1:char.varchar的区别是什么?varchar是变长而char的长度是固定的.如果你的内容是固定大小的,你会得到更好的性能. 问题2: TRUNCATE和DELETE的区别是什么?DEL ...

  4. 解决 "Could not autowire. No beans of 'SationMapper' type found" 的问题

    网上查找的方法,附上原文链接:https://blog.csdn.net/Coder_Knight/article/details/83999139 方法1:在mapper文件上加@Repositor ...

  5. PAT Basic 1091 N-自守数 (15 分)

    如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断一个给定的 ...

  6. kloxo增加了域名,怎么不能访问?如何重启web服务?

    kloxo增加了域名,怎么不能访问?这是因为需要重新启动web服务. 有时候网站打不开,也可以尝试重启web服务. 重启web服务方法: 登录kloxo后台-->左边栏:服务器linux --& ...

  7. tomcat CATALINA_HOME与CATALINA_BASE的区别

    区别 https://blog.csdn.net/cfydaniel/article/details/41351927 Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量) ht ...

  8. 【30分钟学完】canvas动画|游戏基础(7):动量守恒与多物体碰撞

    前言 一路沿着本系列教程学习的朋友可能会发现,前面教程中都尽量避免提及质量的概念,很多运动概念也时刻提醒大家这不是真实的物体运动.因为真实的物体运动其实跟质量都是密不可分的,而且质量的引入自然必须提及 ...

  9. java作业利用递归解决问题

    第一题 利用递归求组合数 设计思想 (1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算 (2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数 ...

  10. scrapy五大核心组件和中间件以及UA池和代理池

    五大核心组件的工作流程 引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. ...