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.hqwc.cn/news/299506.html

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

相关文章

redis—String字符串

目录 前言 1.字符串数据类型 2.常见命令 3.典型应用场景 前言 字符串类型是Redis最基础的数据类型&#xff0c;关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型&#xff0c;而且其他几种数据结构也都是在字符串类似基础.上构建的&#xff0c;例如列表…

《深入理解C++11:C++11新特性解析与应用》笔记三

第三章 通用为本 专用为末 3.1 继承构造函数 派生类如果要使用基类的构造函数&#xff0c;通常要在构造函数中显式声明&#xff1a; 如果基类中有很多版本的构造函数&#xff0c;派生类里想要拥有和基类那样多的构造函数&#xff0c;就必须一一透传各个接口&#xff0c;相当麻…

Json和Xml

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第21章《Json和Xml》 二、Xml的介绍 Xml的含义&#xff1a; 可标记性语言&#xff0c;它将数据以一种特别简单文本格式储存。让所有人和几乎所有的计算机都能理解。 XML文件示例&#xff1a; <?xml version"1.…

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断

series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…

AG16KDDF256 User Manual

AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片&#xff0c;具有 AG16K FPGA的可编程功能&#xff0c;提供更多可编程 IO&#xff0c;同时内部连接大容量 DDR-SDRAM。  FPGA 外部管脚 FBGA256 封装&#xff0c;管脚说明请见下表 Table-1&#xff1a; Tab…

一篇讲透:箭头函数、普通函数有什么区别

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…

【JAVA面试题】static的作用是什么?详细介绍

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 解释 静态变量&#xff08;类变量&#xff09;&#xff1a; 静态方法&#xff1a; 静态块&#xff1a; 静态内部类&#xff1a…

人工智能_机器学习074_SVM支持向量机_软间隔与优化目标函数构建_C参数由来_惩罚误差点的惩罚度---人工智能工作笔记0114

然后我们接着上一节再来看一下这里我们说有个 min_faces_per_person = 0 这个可以看到如果我们写上0,就意味着要加载所有的人脸图片,就会花费的时间久对吧 我们可以试试,这里我们 min_faces_per_person = 0 改成0然后 我们等一会加载完了以后,我们用 display(X.shape,faces.sh…

5g消息-5G时代短信升级-富媒体智能交互-互联网新入口

在5G时代&#xff0c;运营商和各大手机厂商都在积极推进5G消息的商用&#xff0c;基于短信入口的富媒体消息应用在近两年得到快速发展&#xff0c;并在企业端形成了广泛应用。 作为5G时代的数字原生应用&#xff0c;5G消息支持用户通过文字、图片、音频、视频、位置等富媒体方式…

Windows操作系统中:共享文件夹以及防火墙介绍

目录 一.共享文件夹 1.什么是共享文件夹 2.共享文件夹的优点以及不足 优点 不足之处 3.实际案例操作 共享介绍 普通共享 实例展示 高级共享 实例展示 二.防火墙 1.防火墙介绍 主要功能 2.防火墙常见的应用场景 3.实例操作 操作介绍 出现的问题 解决措施…

在Go语言中实现HTTP中间件

在Web开发中&#xff0c;中间件是一种非常流行的设计模式&#xff0c;它可以用于处理请求、拦截请求并对其进行处理或转换。而在Go语言中&#xff0c;实现HTTP中间件就像给自己的HTTP服务器穿上了一层“魔法外衣”&#xff0c;让它变得更加灵活、可配置和可扩展。下面&#xff…

椭球面系列---射线与椭球面的交点

射线与椭球体的交点问题的求解是一个非常常见和经典的问题&#xff0c;本文给出具体的计算原理和矩阵表达的过程&#xff0c;便于编程计算。 见下图&#xff0c;已知射线(点为 p 0 \textbf{p}_0 p0​&#xff0c;单位方向为 d \textbf{d} d)&#xff0c;那么与椭球面的交点 p …