今日内容概要

  • 序列化多表操作
  • 请求与相应
  • 视图组件

内容详细

1、序列化多表操作

模型类 models.py中

# 新建django项目
# 创建表 模型类models.py中:
from django.db import models # 4张表
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE) # to='Publish' 自动关联publish表主键 // on_delete=models.CASCADE 级联删除
authors = models.ManyToManyField(to='Author') def __str__(self):
return self.name @property
def publish_detail(self): # 定制字段
return {'name': self.publish.name, 'addr': self.publish.city} @property
def author_list(self): # 定制字段
l = []
# print(self.authors.all())
for author in self.authors.all():
# print(author.author_detail)
l.append({'name': author.name, 'age': author.age, 'addr': author.author_detail.addr})
return l class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail', on_delete=models.CASCADE)
# OneToOneField 就是 ForeignKey + unique=True class AuthorDatail(models.Model):
telephone = models.BigIntegerField()
addr = models.CharField(max_length=64) class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField() """
在每个表中写入数据一一对应
第五个自动创建的关联表 也写入数据
"""

创建序列化类 serializer.py

from .models import *
from rest_framework import serializers class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
# fields = '__all__'
fields = ['id', 'name', 'price', 'authors', 'publish', 'publish_detail', 'author_list'] # 由于前端的publish与authors会显示为:id 所以需要定制序列化字段
# depth=1 # 等同于定制序列化的字段(2种方案) 但是尽量不要用,因为它是关联表一层全部取出来
# 定制序列化的字段(2种方案)选择表模型中: 显示出版社名、地址;作者名年龄地址
extra_kwargs = {
'publish': {'write_only': True}, # 原有的字段就不需要再显示
'authors': {'write_only': True},
} class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__' class AuthorDetailSerialzier(serializers.ModelSerializer):
class Meta:
model = AuthorDatail
fields = '__all__' class PublishSerialzier(serializers.ModelSerializer):
class Meta:
model = Publish
fields = '__all__'

视图类 views.py中:

from .serializer import *
from rest_framework.response import Response
from rest_framework.views import APIView
from app01.models import Book class BookView(APIView):
# 查询所有图书
def get(self, request):
book_list = Book.objects.all()
ser = BookSerializer(instance=book_list, many=True)
return Response(ser.data) # 新增图书数据
def post(self, request):
ser = BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({"code": 100, 'msg': '新增成功', 'data': ser.data})
return Response({"code": 101, 'msg': '新增失败', 'err': ser.errors}) class BookDetailView(APIView): # 查询单条数据
def get(self, request, pk):
book = Book.objects.all().filter(pk=pk).first()
ser = BookSerializer(instance=book)
return Response(ser.data) # 修改数据
def put(self, request, pk):
book = Book.objects.all().filter(pk=pk).first()
ser = BookSerializer(instance=book, data=request.data)
if ser.is_valid():
ser.save()
return Response({"code": 100, 'msg': '修改成功', 'data': ser.data})
return Response({"code": 101, 'msg': '修改出错', 'err': ser.errors}) # 删除数据
def delete(self, request, pk):
Book.objects.filter(pk=pk).delete()
return Response({"code": 100, 'msg': '删除成功'})

路由 urls.py中:

from django.contrib import admin
from django.urls import path from app01 import views urlpatterns = [
path('admin/', admin.site.urls), path('books/', views.BookView.as_view()),
path('books/<int:pk>', views.BookView.as_view()),
]

2、请求与相应

2.1 请求

# 请求就是指:Request 类的对象
>>> 新的request对象 # 导入:
from rest_framework.request import Request # 需要记住的源码:
__getattr__
request.data
request.query_parmas--->self._request.GET
restful规范里,请求地址中带过滤(查询)条件
get请求地址中提交的数据在GET中,
query_parmas:查询参数 # 了解
默认情况下,可以解析 urlencoded,formdata,json # 案例:
如果我们写了一个接口,想只能处理json格式,或者只能处理formdata 1.局部配置 在views.py中:
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser class PublishView(APIView):
# 局部使用,只针对当前视图类有效
# 只想处理json格式
# parser_classes = [JSONParser,FormParser,MultiPartParser] # 默认下 是处理三种格式数据
parser_classes = [JSONParser] # 只允许处理 JSONParser格式 def post(self, request):
print(request.data)
return Response('post---publish') 2.全局配置-->要在配置文件中添加:
# REST_FRAMEWORK 以后是drf的配置
# 所有接口都只能解析json格式
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
],
} 3.全局配置解析json,局部某个视图函数想能解析formdata格式
视图类中配置一下即可 就是局部配置(按照使用顺序) # 如果局部配置如下,会怎么样
parser_classes = [] # 所有格式都补不能解析了 # 使用顺序:
即使我们没有配置局部或者全局,也有默认配置:3个数据模式都能解析 视图类中配的(优先用)
项目配置文件的配置(其次)
drf有默认配置(最后) drf的默认配置:from rest_framework import settings # 总结:
一般情况下,都使用默认即可,不用配置(三种格式数据都能解析)

2.2 响应

# 其实就是:Respone 返回给前端的

# 导入:
from rest_framework.response import Response # 源码分析
1.属性:
data=None, # 返回给前端的数据:可以是 字符串,字典,列表 就是给http响应body体中内容-->也可以是response对象中取出数据并 处理 status=None, # 响应状态码:1xx,2xx,3xx,默认是200 headers=None, # 响应头 字典 了解:
template_name=None, # 模板名字(不用),用浏览器访问时,可以改
exception=False, # 异常处理
content_type=None # 响应编码格式 from rest_framework.status import HTTP_201_CREATED
Response(ser.data,status=HTTP_201_CREATED) 2.响应格式 跟解析数据格式类似
# 局部配置 在视图类 views.py中配置:
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
class BookDetailView(APIView):
renderer_classes = [JSONRenderer, ] # 全局设置 在配置文件中配置:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}

3、视图组件

# APIView
from rest_framework.views import APIView 类属性 renderer_classes,parser_classes...
get方法,post方法,delete方法 写法跟之前的View一样,只不过request对象变成了新的request
比之前的View多了三大认证和全局异常处理 # GenericAPIView 继承了APIView 但是多了属性和方法
from rest_framework.generics import GenericAPIView 属性(先记两个):
queryset = None
serializer_class = None 方法:
get_queryset
get_object
get_serializer # 5个视图扩展类(不是视图类,没有集成APIView,需要配合GenericAPIView)
from rest_framework.mixins import
CreateModelMixin,
ListModelMixin,
DestroyModelMixin,
RetrieveModelMixin,
UpdateModelMixin # 9个视图子类
from rest_framework.generics import
CreateAPIView,
ListAPIView,
DestroyAPIView,
RetrieveAPIView,
UpdateAPIView,
ListCreateAPIView,
RetrieveUpdateAPIView,
RetrieveUpdateDestroyAPIView,
RetrieveDestroyAPIView # 视图集
from rest_framework.viewsets import
# 两个视图类
ModelViewSet, ReadOnlyModelViewSet,
# 视图类
ViewSet, GenericViewSet,
# 魔法类
ViewSetMixin

继承GenericAPIView 重写视图类

# 添加路由:
path('publishs/<int:pk>', views.PublishDetailView.as_view()), # 视图类复制过来并做修改:
# 第一层:继承APIView写视图类 # 第二层:继承GenericAPIView写视图类
from rest_framework.generics import GenericAPIView class PublishView(GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerialzier # 查询所有图书
def get(self, request):
# obj = self.queryset
obj = self.get_queryset() # 等同于上面,obj = self.queryset 并且更好一些 # ser = self.serializers(instance=obj, many=True)
# ser=self.get_serializer_class()(instance=obj,many=True) # 等同于上面
ser = self.get_serializer(instance=obj, many=True) # 等同于上面
return Response(ser.data) # 新增图书数据
def post(self, request):
# ser = BookSerializer(data=request.data)
ser = self.get_serializer(data=request.data) # 等同于上面
if ser.is_valid():
ser.save()
return Response({"code": 100, 'msg': '新增成功', 'data': ser.data})
return Response({"code": 101, 'msg': '新增失败', 'err': ser.errors}) class PublishDetailView(GenericAPIView):
queryset = Publish.objects.all()
serializer_class = PublishSerialzier # 查询单条数据
def get(self, request, *args, **kwargs):
# book = Book.objects.all().filter(pk=pk).first()
obj = self.get_object() # 等同于上面 # ser = BookSerializer(instance=book)
ser = self.get_serializer(instance=obj) # 等同于上面
return Response(ser.data) # 修改数据
def put(self, request, *args, **kwargs):
# book = Book.objects.all().filter(pk=pk).first()
obj = self.get_object() # 等同于上面 # ser = BookSerializer(instance=book, data=request.data)
ser = self.get_serializer(instance=obj, data=request.data) # 等同于上面
if ser.is_valid():
ser.save()
return Response({"code": 100, 'msg': '修改成功', 'data': ser.data})
return Response({"code": 101, 'msg': '修改出错', 'err': ser.errors}) # 删除数据
def delete(self, request, *args, **kwargs):
# Book.objects.filter(pk=pk).delete()
self.get_object().delete()
return Response({"code": 100, 'msg': '删除成功'})

4、通过GenericAPIView + 5个视图扩展类 重写视图类

# 第三层:GenericAPIView+5个视图扩展类 重写视图类
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin, ListModelMixin, DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin class PublishView(GenericAPIView, CreateModelMixin, ListModelMixin):
queryset = Publish.objects.all()
serializer_class = PublishSerialzier # 查询所有图书
def get(self, request):
return super().list(request) # list(request)ListModelMixin的方法 # 新增图书数据
def post(self, request):
return super().list(request) # create(request)ListModelMixin的方法 class PublishDetailView(GenericAPIView, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin):
queryset = Publish.objects.all()
serializer_class = PublishSerialzier # 查询单条数据
def get(self, request, *args, **kwargs):
return super().retrieve(request, *args, **kwargs) # 修改数据
def put(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs) # 删除数据
def delete(self, request, *args, **kwargs):
return super().destroy(request, *args, **kwargs)

序列化多表操作、请求与响应、视图组件(子类与拓展类)、继承GenericAPIView类重写接口的更多相关文章

  1. EF中多表公共字段,以及设置EntityBase使所有实体类继承自定义类

    使用EF框架访问数据库时,如果某些表具有公共字段,例如在审核流程中,对于各类申请单资料的创建人.创建时间.修改人.修改时间,这些可能多表都需要的字段,如果在每个实体中进行赋值操作显然是类似和重复的,下 ...

  2. SpringBoot swagger-ui.html 配置类继承 WebMvcConfigurationSupport 类后 请求404

    1 .SpringBoot启动类加上  注解 @EnableWebMvc @SpringBootApplication@EnableWebMvc public class Application { ...

  3. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  4. ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件

    作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...

  5. ASP.NET Core Razor 视图组件

    视图组件简介 在新的ASP.NET Core MVC中,视图组件类似于局部视图,但它们更强大.视图组件不使用模型绑定,仅依赖于您在调用时提供的数据. 视图组件特性: 呈现页面响应的某一部分而不是整个响 ...

  6. asp.net core 视图组件(转)

    介绍视图组件 视图组件是 ASP.NET Core MVC 中的新特性,与局部视图相似,但是它们更加的强大.视图组件不使用模型绑定,只取决于调用它时所提供的数据.视图组件有以下特点: 渲染一个块,而不 ...

  7. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  8. nop 4.1 Widget 探究- 视图组件

    1. 系统默认自带了一个NivoSlider 的Wdget. 在Nop.Web项目首页的HomePageTop里 这个写法是 ASP.NET Core MVC 中的新特性 视图组件,与局部视图相似,但 ...

  9. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

随机推荐

  1. 2020.9.28 多进程multiprocess 进程池pool 子进程subprocess 进程间通信

    1.multiprocessing模块--跨平台版本的多进程模块 multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束: from ...

  2. Python:HTTP请求头headers信息的查询

    GET和POST请求后会返回一个response对象,可通过key.values等访问字典中元素的方式来访问该response对象headers中的各种属性 r=requests.get(url,he ...

  3. python面试_总结01_概念和内置高阶函数

    - 简答题 1.请谈谈Python中is 和 == 的区别(代码演示) is用于比较两个变量是否引用了同一个内存地址,is表示的是对象标识符(object identity),作用是用来检查对象的标识 ...

  4. GoLang设计模式21 - 装饰模式

    装饰器模式是一种结构型设计模式.通过装饰器模式可以为一个对象添加额外的功能而不需对其作出调整. 还是通过具体的案例来了解装饰器模式:假设我们开了一家披萨店,现在店里主营两款披萨: 素食狂披萨(Vegg ...

  5. laravel 根据字段不同值做不同查询

    在开发过程中我们经常遇到这种情况: 例如,一个信息表message,字段type 1.操作提醒 2.平台通知,表message_read记录当信息是平台通知时用户浏览状况 那么 当信息是平台通知时是针 ...

  6. yum 安装时报错 Existing lock /var/run/yum.pid: another copy is running as pid 3192.

    yum 安装时报错 由于yum的时候意外退出造成的,虽然也给出提示当前占用进行的id,但是执行kill -9  强制杀死进程后,情况没能改变. 解决方法:rm -f /var/run/yum.pid然 ...

  7. 结合AngularJS实现拖拽

    最近项目中要实现,左侧树向右侧树中元素的拖拽功能,开始在网上看了好多ng-drag等等操作,都没有实现预想的效果,偶然发现一篇博客,然后根据博客改编,实现了自己想要的效果.下面简单的分析一下实现过程. ...

  8. docker学习笔记(3)- 镜像

    简介 在docker学习笔记(1)- 架构概述一节中可以看到镜像是docker三大组件之一,可以将Docker镜像类比为虚拟机的模版. 镜像由多个层组成,每层叠加之后从外部看就像一个独立的对象,镜像的 ...

  9. Redis 大 key 问题总结

    多大的 key 算大? 阿里云Redis 最佳实践中提到 合理的 Key 中 Value 的字节大小,推荐小于10 KB.过大的 Value 会引发数据倾斜.热点Key.实例流量或 CPU 性能被占满 ...

  10. Java案例——反转字符串

    /*案例:将用户输入的字符串反转并输出 分析:1.使用Scanner 类获取用户输入的字符串 2.定义一个方法将字符串反着遍历并拼接 3.定义变量接受并输出* */public class Strin ...