入门Django项目Day3

125 阅读9分钟

入门Django项目Day3

1.知识总揽

接下来我们需要学习许多知识:QuerySet、Instance、Django REST Framework中的(Django Serialization序列化、Django APIView、ModelViewSet、路由组件、Django-DRF自定义函数) ok,知识不多,接下来让我们看啊可能都有什么作用。 学到这一小节,其实视图是我们理解Django REST Framework的一个重要知识点。

Serialization序列化:将 querysetinstance 转换为 json/xml/yaml 返回给前端 反序列化与序列化则相反。

APIViewAPIViewREST 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文件撰写序列化内容。

代码如下所示:

one.png

更加细节的内容可以找官方文档来看。

ok,这个时候我们就可以开始在views.py文件中使用序列化器。

two.png

序列化 单个或多个对象的区别在于,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类。

还有下面这个类

three.png

APIView的灵活性在于它允许我们按照需求定义多个HTTP方法,使得API视图的逻辑更加清晰。无论是获取列表、创建对象,还是进行其他操作,我们都可以根据实际情况在一个类中完成。这样的代码组织方式不仅提高了代码的可读性,还使得代码的维护更加方便。

同时配合我们在urls.py中配置路由:

path('filtergoodscategoryapi/',FilterGoodsCategoryAPI.as_view())

ok,接下来到我们第五点

5.ModelViewSet

modelviewset到底用来干嘛的呢,总的来说是用来增删改查的。 ModelViewSet是封装度最高的DRF的视图类。包含了增删改查中的所有接口操作。

到这里很疑惑吧,不是说好有QuerySet和Instance吗,怎么又来一个新的ModelViewSet(新学者表示很迷啊,怎么回事)。

不着急,我们先来看看怎么使用它:

four.png

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中。 看起来是不是很简单。

five.png

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 获取主键)。

学到这里其实还是有点懵懵的对吧,不过没关系,我们后续还会有总结会有进一步的知识扩展。