drf知识--05

两个视图基类

# APIView:之前一直在用---》drf提供的最顶层的父类---》以后所有视图类,都继承自它
# GenericAPIView:继承自APIView--》封装

继承APIView+序列化类+Response写接口

# urls.py--总路由
from django.contrib import admin
from django.urls import path,include
from app01 import views
urlpatterns = [path('admin/', admin.site.urls),path('app/',include('app01.urls'))]# urls.py--子路由app01
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [path('books/', views.BookView.as_view()),path('books/<int:pk>', views.BookDetailView.as_view()),]
# 序列化类
from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'name', 'price', 'publish', 'authors', 'publish_detail', 'author_list']extra_kwargs = {'publish': {'write_only': True},'authors': {'write_only': True},'publish_detail': {'read_only': True},'author_list': {'read_only': True},}
# models.py
from django.db import modelsclass 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)authors = models.ManyToManyField(to='Author')@propertydef publish_detail(self):return {'name': self.publish.name, 'city': self.publish.city}@propertydef author_list(self):l = []for author in self.authors.all():l.append({'name': author.name, 'age': author.age})return ldef __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)def __str__(self):return self.nameclass AuthorDetail(models.Model):telephone = models.BigIntegerField()birthday = models.DateField()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()def __str__(self):return self.nameclass Meta:verbose_name = '出版社'verbose_name_plural = verbose_name
# views.py
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(ser.data)else:return Response(ser.errors)class BookDetailView(APIView):def put(self, request, *args, **kwargs):book = Book.objects.filter(pk=kwargs.get('pk')).first()ser = BookSerializer(instance=book, data=request.data)if ser.is_valid():ser.save()return Response(ser.data)else:return Response(ser.errors)def get(self, request, *args, **kwargs):book = Book.objects.filter(pk=kwargs.get('pk')).first()ser = BookSerializer(instance=book)return Response(ser.data)def delete(self, request, *args, **kwargs):Book.objects.filter(pk=kwargs.get('pk')).delete()return Response('')

继承GenericAPIView+序列化类+Response写接口

# 继承GenericAPIView的写法
    -1 在类中,写两个类属性:所有数据,序列化类
        queryset = Book.objects.all()
        serializer_class = BookSerializer

    -2 获取所有要序列化的数据:
        self.get_queryset()
    -3 获取序列化类
        self.get_serializer(参数跟之前一样)
    -4 获取单挑
        self.get_object()
# 如果想快速写出Publish的5个接口,只需要修改视图类上的两个类属性即可
        queryset = Publish.objects.all()
        serializer_class = PublishSerializer

# GenericAPIView源码分析:
   1 继承了APIView
   2 有些类属性--》目前只记住两个queryset,serializer_class

queryset            # 要序列化的所有数据
serializer_class    # 序列化类
lookup_field = 'pk' # 查询单条,前端传入的参数对应值【pk】,转换器
filter_backends     # 后续要学的,过滤
pagination_class    # 后续要学的,分页

   3 有些对象方法
get_queryset: 返回待序列化的数据
      调用 .all ,在子类中重写,控制要序列化的数据
get_serializer: 返回 序列化类  以后用它
      本质就是 self.serializer_class(instance=object_list, many=True) 
      内部调用了:self.get_serializer_class
      后期可在子类中重写get_serializer_class,返回什么序列化类就以哪个序列化类做序列化

get_object:获取单条,根据它:lookup_field   获取

get_serializer_class 它是用来重写的
def get_serializer_class(self):if self.request.method=='GET':return '序列化的类'else:return '反序列化的类'

# 对象属性查找顺序:

             在类中定义了属性,对象中放入了属性
             self.属性  用的对象自己的,如果对象中没放:self.属性用了类的

# 总结:

# urls.py
urlpatterns = [path('books/', views.BookView.as_view()),path('books/<int:pk>', views.BookDetailView.as_view()),path('publish/', views.PublishView.as_view()),path('publish/<int:pk>', views.PublishDetailView.as_view()),
]
# serializer.py
class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'name', 'price', 'publish', 'authors', 'publish_detail', 'author_list']extra_kwargs = {'publish': {'write_only': True},'authors': {'write_only': True},'publish_detail': {'read_only': True},'author_list': {'read_only': True},}
class PublishSerializer(serializers.ModelSerializer):class Meta:model = Publishfields = "__all__"
# views.py
from rest_framework.generics import GenericAPIView
from .models import Publish
from .serializer import PublishSerializerclass BookView(GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializerdef get(self, request):object_list = self.get_queryset()  # 获取所有要序列化的数据ser = self.get_serializer(instance=object_list, many=True)  # 获取序列化类return Response(ser.data)def post(self, request):ser = self.get_serializer(data=request.data)if ser.is_valid():ser.save()return Response(ser.data)else:return Response(ser.errors)class BookDetailView(GenericAPIView):queryset = Book.objects.all()serializer_class = BookSerializerdef put(self, request, *args, **kwargs):obj = self.get_object()  # 获取单挑---》内部就是按pk从request中取,取出pk对应的值,查询的ser = self.get_serializer(instance=obj, data=request.data)if ser.is_valid():ser.save()return Response(ser.data)else:return Response(ser.errors)def get(self, request, *args, **kwargs):obj = self.get_object()ser = self.get_serializer(instance=obj)return Response(ser.data)def delete(self, request, *args, **kwargs):self.get_object().delete()return Response('')

5个视图扩展类

# 继承 GenericAPIView+5个视图扩展类+序列化类+Response

# views.py
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin, \DestroyModelMixinclass BookView(GenericAPIView, CreateModelMixin, ListModelMixin):queryset = Book.objects.all()serializer_class = BookSerializerdef get(self, request):return super().list(request)def post(self, request):# 做保存,加了这一句---》目的是:子类可以重写,增强扩展性# self.perform_create(serializer)return super().create(request)class BookDetailView(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):queryset = Book.objects.all()serializer_class = BookSerializerdef put(self, request, *args, **kwargs):return super().update(request, *args, **kwargs)def get(self, request, *args, **kwargs):return super().retrieve(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return super().destroy(request, *args, **kwargs)

9个视图子类

# CreateAPIView继承了 GenericAPIView, CreateModelMixin,写了post方法

views.py
from rest_framework.generics import CreateAPIView, ListAPIView
from rest_framework.generics import RetrieveAPIView, DestroyAPIView, UpdateAPIView
from rest_framework.generics import ListCreateAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView
# from rest_framework.generics import DestroyUpdateAPIView # 一般不存在,所以就没有# 实现新增,查所有和查询一条
class BookView(ListCreateAPIView):# 配置两个类属性queryset = Book.objects.all()serializer_class = BookSerializerclass BookDetailView(RetrieveAPIView):queryset = Book.objects.all()serializer_class = BookSerializer

视图集

# views.py
from rest_framework.viewsets import ModelViewSet
class BookView(ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer
urls.py
path('books/', views.BookView.as_view({'get':'list','post':'create'})),
path('books/<int:pk>', views.BookView.as_view({'get':'retrieve','put':'update','delete':'destroy'})),

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/577181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch 使用映射定义索引结构

动态映射 dynamic 可选值解释true默认值&#xff0c;启用动态映射&#xff0c;新增的字段会添加到映射中runtime查询时动态添加到映射中false禁用动态映射&#xff0c;忽略未知字段strict发现未知字段&#xff0c;抛出异常 显示映射 创建映射 PUT user {"mappings&qu…

Elasticsearch可视化平台Kibana [ES系列] - 第498篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 全…

three.js后处理(发光描边OutlinePass描边样式

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"></div>&…

圆通速递查询,圆通速递单号查询,对需要的单号记录进行标记

随着网购的普及&#xff0c;快递服务已经深入到我们生活的方方面面,我们每天都需要处理大量的快递信息,为了更高效地管理这些信息&#xff0c;【快递批量查询高手】应运而生。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; …

不同参数规模大语言模型在不同微调方法下所需要的显存总结

原文来自DataLearnerAI官方网站&#xff1a; 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…

IntelliJ IDEA快捷键及调试

文章目录 一、IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、…

05|提示工程(下):用思维链和思维树提升模型思考质量 ## 什么是 Chain of Thought

05&#xff5c;提示工程&#xff08;下&#xff09;&#xff1a;用思维链和思维树提升模型思考质量 什么是 Chain of Thought CoT 这个概念来源于学术界&#xff0c;是谷歌大脑的 Jason Wei 等人于 2022 年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large La…

使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理

1、通用的业务编码规则的管理功能 在前面随笔我们介绍了一个通用的业务编码规则的管理功能&#xff0c;通过代码生成工具Database2Sharp一步步的生成相关的后端和Winform、WPF的界面&#xff0c;进行了整合&#xff0c;通过利用代码生成工具Database2sharp生成节省了常规功能的…

DreamTuner :通过单张图片实现主题驱动的图像生成

该项目由字节跳动开发&#xff0c;你只需要提供一张图片&#xff0c;DreamTuner就能帮你生成与这张图片在主题和风格上一致的新图像。比如你有一张可乐照片&#xff0c;它可以根据你的要求将可乐放在任何场景中或添加其他元素形成一张完美海报&#xff01; 这个工具特别适用于需…

PyAV 使用浅谈

背景&#xff1a; PyAV是一个用于音频和视频处理的Python库&#xff0c;它提供了一个简单而强大的接口&#xff0c;用于解码、编码、处理和分析各种音频和视频格式。PyAV基于FFmpeg多媒体框架&#xff0c;它本质上是FFmpeg 的Python绑定&#xff0c;因此可以利用FFmpeg的功能来…

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…

Docker介绍、常用命令与操作

Docker介绍、常用命令与操作 学习前言为什么要学习DockerDocker里的必要基础概念常用命令与操作1、基础操作a、查看docker相关信息b、启动或者关闭docker 2、容器操作a、启动一个镜像i、后台运行ii、前台运行 b、容器运行情况查看c、日志查看d、容器删除 3、镜像操作a、镜像拉取…

框架面试题

文章目录 1. spring中的bean是线程安全的吗2. 事务的实现--AOP3. 项目中用到的AOP4.spring中事务的失效场景5. Bean的生命周期6.spring中的循环引用问题7. springMVC的执行流程8. springboot自动装配原理9. 常见注解10 Mybatis11 Mybatis一二级缓存 1. spring中的bean是线程安全…

PoE交换机传输距离是多少?100米?250米?

你们好&#xff0c;我的网工朋友。 今天和你聊聊PoE交换机&#xff0c;之前有系统地给你讲解过一篇&#xff0c;可以先回顾一下哈&#xff1a;《啥样的交换机才叫高级交换机&#xff1f;这张图告诉你》 为什么都说PoE交换机好&#xff1f;它最显著的特点就是&#xff1a; 可…

SQL手工注入漏洞测试(MySQL数据库)

一、实验平台 https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe 二、实验目标 获取到网站的KEY&#xff0c;并提交完成靶场。 三、实验步骤 ①、启动靶机&#xff0c;进行访问查找可能存在注入的页面 ②、通过测试判断注入点的位置(id) (1)…

PyTorch官网demo解读——第一个神经网络(3)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;2&#xff09;-CSDN博客 上一篇文章我们讲解了第一个神经网络的模型&#xff0c;这一篇我们来聊聊梯度下降。 大佬说梯度下降是深度学习的灵魂&#xff1b;梯度是损失函数&#xff08;代价函数&#xff…

云渲染UE4像素流送搭建(winows、ubuntu)

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行&#xff0c;用户可以通过浏览器操作虚幻引擎应用程序&#xff0c;客户端无需下载虚幻引擎&#xff0c;本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

智能优化算法应用:基于广义正态分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于广义正态分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于广义正态分布算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.广义正态分布算法4.实验参数设定…

【序列化和反序列化】

&#x1f341;什么是序列化和反序列化&#xff1f; &#x1f341;典型解析&#x1f341;拓展知识仓&#x1f341;如何进行序列化和反序列化&#x1f341;未实现Serializable&#xff0c;可以序列化吗? &#x1f341;典型解析 在Java中&#xff0c;我们可以通过多种方式来创建对…

我的NPI项目之Android电源系列(四) -- 关于剩余充满时间的问题的代码跟踪-max1720x_battery.c qpnp-smb2.c

从我的NPI项目之Android电源系列(三)&#xff0c; 能够看出&#xff0c;healthd是通过读取/sys/class/power_supply/battery/time_to_full_now而进行充满剩余时间的。 在/sys/class/power_supply/battery/...目录下有很多文件&#xff0c;具体内容如下&#xff1a; /sys/class…