入门Django项目Day3
1.知识总揽
接下来我们需要学习许多知识:QuerySet、Instance、Django REST Framework中的(Django Serialization序列化、Django APIView、ModelViewSet、路由组件、Django-DRF自定义函数) ok,知识不多,接下来让我们看啊可能都有什么作用。 学到这一小节,其实视图是我们理解Django REST Framework的一个重要知识点。
Serialization序列化:将 queryset 和 instance 转换为 json/xml/yaml 返回给前端
反序列化与序列化则相反。
APIView:APIView是REST framework提供的所有视图的基类,继承自Django的View类
APIView与View的不同点为: 1.传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象。 2.视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端期望要求格式。 3.任何APIException异常都会被捕获到,并且处理成合适格式(json)的响应信息返回给客户端。 4.会重新声明了一个新的as_views方法并在dispatch()进行路由分发前,对请求的客户端进行身份认证、权限检查、流量控制。
ModelViewSet:是 Django REST framework 提供的一个视图集类,它封装了常见的模型操作方法。模型类提供了默认的增删改查功能。(ok,又是我们常见的增删改查)
路由组件DefaultRouter:Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由,从而减少了手动编写URL路由的工作量。(这个很简单)
自定义函数:@action 是 Django REST framework 中的一个装饰器,用于将自定义函数转换为视图集的一个动作。@action` 装饰器提供了一种定义自定义函数的方式,这些函数并不直接对应于标准的 CRUD 操作(Create-Read-Update-Delete),而是实现一些其他的自定义行为或业务逻辑。
是不是有点迷,ok,当我学到这里还是有点迷。
没关系,我们先学知识。
内容较多:Django-DRF视图集 - 赵刚、 - 博客园 (cnblogs.com)
如果发现看完这边的文章没看明白,可以看上面这个链接里面的相关知识可以了解了解,帮助加深理解。
2.QuerySet和Instance
QuerySet和Instance是两个重要的概念,它们在处理数据时具有不同的作用和用途。一句话包含他们之间的关系:Django的ORM通过Mode的objects属性提供各种数据操的接口(API),并通过 Model.objects 方法返回QuerySet,生产符合查询条件的列表,列表中包含多个 Instance。QuerySet是DRF中的一个核心概念,它是由Model.objects方法返回的,用于在数据库中执行查询操作并返回满足特定条件的对象集合。QuerySet实际上是一种灵活的、惰性的查询表达式,可以用于过滤、排序、聚合等操作。 常见的QuerySet操作方法:
filter()、get()、all()、delete()、update()、create()、count()、order_by()
看名字就知道干嘛用的了。
filter()用于返回符合特定条件的所有数据 get()方法类似于filter(),但是用于返回符合条件的单个对象。需要注意的是,如果有多个满足,get()方法会引发异常。 all()方法会返回model的所有对象。
delete()方法删除符合条件的所有对象。
update()方法用于更新符合条件的所有对象的特定字段值。
create()用于创建并保存此新的对象 。
count()方法返回符合条件的对象数量。
order_by()方法对返回的对象进行排序,默认升序,添加负号则表示降序。
常用的Instance操作:
instance是指Django模型的单个实例,即数据库中的一行数据。它用于对单个模型实例进行创建、更新或删除等操作。
1.创建对象:Obj = Model(attr1=val1, attr2=val2)。
2.更新对象:通过Model.objects.get(id=xxx)获取对象,修改属性值。
3.删除对象:Model.objects.get(id=xxx)获取对象,然后调用Obj.delete()删除该对象。
1、2都可以使用obj.save()进行保存 更改。 QuerySet和Instance区别:
具体情况,具体用,单个对象的操作一般用instance,多个对象查询等操作可以用QuerySet。
3.Serialization序列化
(第三点和第四点联系是很紧密的,内容都是串联的)
前面已经讲述了它的作用,主要就是充当转换格式的中介,通过queryset和instance转换为合适的格式返回前端。
那么我们如何定义一个序列化器呢?
首先我们新建一个serializers.py文件撰写序列化内容。
代码如下所示:
更加细节的内容可以找官方文档来看。
ok,这个时候我们就可以开始在views.py文件中使用序列化器。
序列化 单个或多个对象的区别在于,many=Ture,就这样,很简单
然后我们给GetGoods配置一个路由,这个很简单
path('getgoods/',GetGoods.as_view()),
我们这里可以看到怎么会有个.as_view()方法,诶,没学过 ,ok很简单,上网查一下。 django类视图as_view()方法解析 - olivertian - 博客园 (cnblogs.com)
django类视图as_view()方法解析总结_django as_view()-CSDN博客
django基类View.as_view() - _Undo - 博客园 (cnblogs.com) 以上链接大家可以慢慢去看。 诶,有人这个时候又说上面有个APIView,我不会啊,怎么办,诶,没关系,接下来就说这个。
4.APIView
APIView是专门用于处理基于HTTP协议的请求和响应。APIView的目标是提供一种易于使用且高度可定制的方式来构建API视图。APIView将代码以面向对象的方式组织,使得视图逻辑更加清晰、结构更加易于维护。
真正理解还需要从实践中来,我们看实现: 我们会创建一个继承APIView的类,并在其中实现相应的HTTP方法,如GET、POST、PUT等。 就像我们上面那幅图中的GetGoods类。
还有下面这个类
APIView的灵活性在于它允许我们按照需求定义多个HTTP方法,使得API视图的逻辑更加清晰。无论是获取列表、创建对象,还是进行其他操作,我们都可以根据实际情况在一个类中完成。这样的代码组织方式不仅提高了代码的可读性,还使得代码的维护更加方便。
同时配合我们在urls.py中配置路由:
path('filtergoodscategoryapi/',FilterGoodsCategoryAPI.as_view())
ok,接下来到我们第五点
5.ModelViewSet
modelviewset到底用来干嘛的呢,总的来说是用来增删改查的。 ModelViewSet是封装度最高的DRF的视图类。包含了增删改查中的所有接口操作。
到这里很疑惑吧,不是说好有QuerySet和Instance吗,怎么又来一个新的ModelViewSet(新学者表示很迷啊,怎么回事)。
不着急,我们先来看看怎么使用它:
ok,这里我们包含了querySet、序列化器等知识,分三个步骤:
我们创建了GoodsCategoryViewSet的视图类,设置了querySet、序列化器,然后定义了自定义函数latest,采用了装饰器@action
ok,肯定到这里其实 还是不太明白的,这个时候可以回去看第一个链接来加深理解: ModelViewSet基础讲解(纯干货)-CSDN博客 Django-DRF视图集 - 赵刚、 - 博客园 (cnblogs.com) 这两个链接由浅到深慢慢理解。 去看吧少年,去窃取知识吧。
6.路由组件
DefaultRouter`是Django REST framework中提供的一个路由器类,用于自动生成URL路由。 DefaultRouter会附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。 来,让我们看看如何使用它 :
from django.contrib import admin
from django.urls import path
from apps.firstdjango.views import *
from rest_framework import routers
router = routers.DefaultRouter()
router.register('GoodsCategory',GoodsCategoryViewSet)
urlpatterns = [
path("admin/", admin.site.urls),
path('filtergoodscategory', FilterGoodsCategory),
path('insertgoodscategory/', InsertGoodsCategory),
path('getgoods/',GetGoods.as_view()),
path('filtergoodscategoryapi/',FilterGoodsCategoryAPI.as_view()),
]
urlpatterns += router.urls
首先采用routers.DefaultRouter()创建一个路由器对象,使用router.register方法注册一个视图集,然后可以为这个视图集自动生成对应url路由,并将其添加到urlpatterns中。 看起来是不是很简单。
7.Django-DRF自定义函数
有的小伙伴在上面第五点 modelviewset中看到@action装饰器,好像没见过啊,有点迷怎么回事,不会呀,为什么要这样写,ok,这个@action装饰器就是这第七点的内容了。 Django默认的路由分发规则决定了视图函数只能以get、post等请求方式命名,如果想要使用自定义的方式命名,我们就可以使用action去映射请求方法名和自定义方法(就像第四点apiview一样),所以@action 装饰器用于为 ModelViewSet 方法添加额外的行为。
先让我们看代码,还是在第五点的代码上继续续写:
class GoodsCategoryViewSet(ModelViewSet):
queryset = GoodsCategory.objects.all()
serializer_class = GoodsCategorySerializer
@action(detail=False, methods=['get'])
def latest(self, request):
latest_obj = GoodsCategory.objects.latest('id')
print(latest_obj)
return Response("helllo 你调用了自定义的函数")
@action(detail=False, methods=['get','post'])
def delete_example(self, request):
name = request.data.get('name')
# 删除名称为 'name' 的商品
categories_to_delete = GoodsCategory.objects.filter(name=name)
# 使用delete()方法删除对象
deleted_count= categories_to_delete.delete()
print(f"Deleted {deleted_count} categories.")
@action(detail=False, methods=['get','post'])
def create_example(self, request):
name = request.data.get('name')
# 使用create()方法创建新的商品分类对象
created_category = GoodsCategory.objects.create(name)
print("Created category:", created_category)
methods:此参数是一个包含 HTTP 方法名称的列表,用于指定该操作响应的 HTTP 方法。默认情况下,此参数为 None,表示该操作响应 GET 请求。例如,如果要将此操作绑定到响应 POST 请求的方法,可以将 methods 参数设置为 [‘POST’]。 detail:此参数是一个布尔值,用于指定此操作是否应用于实例/细节请求或集合/列表请求。True 表示此操作应用于实例请求(即通过 URL 获取主键),而 False 表示此操作应用于集合请求(即不使用 URL 获取主键)。
学到这里其实还是有点懵懵的对吧,不过没关系,我们后续还会有总结会有进一步的知识扩展。