相关文章:
Django项目生成Swagger_做测试的喵酱的博客-CSDN博客
viewsets.ViewSet 详解_做测试的喵酱的博客-CSDN博客
一、viewsets.ModelViewSet 介绍
viewsets.ModelViewSet
是 Django Rest Framework (DRF) 中的一个类,它是一个可复用的视图集合,提供了对数据库模型的常见操作(如创建、读取、更新和删除)的默认实现。
我们自定义视图类,继承ModelViewSet后,自动实现
创建、读取、更新和删除等方法。
- .list():列出所有项目的列表,
- .retrieve():检索某一个项目的详细信息
- .create() : 创建一条数据
- update(): 更新列表
- .partial_update():更新一条数据
- .destroy():删除数据
1.1 viewsets.ModelViewSet 引入
from rest_framework import viewsets
1.2 继承关系
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
viewsets.ModelViewSet 继承了 GenericAPIView
和 ModelMixin
,因此它包含了基本的 HTTP 请求方法(GET
、POST
、PUT
、PATCH
和 DELETE
)以及对数据库模型的操作方法。
- mixins.CreateModelMixin -> create 方法
- mixins.RetrieveModelMixin -> retrieve 方法
- mixins.UpdateModelMixin -> update方法
- mixins.DestroyModelMixin -> destroy方法
- mixins.ListModelMixin -> list 方法
使用 viewsets.ModelViewSet
可以很方便地创建一个符合 RESTful 风格的 API 视图集合。以下是对一些常用属性和方法的解释:
queryset
:一个查询集,用于获取要操作的数据库模型对象集合。可以通过在子类中重写该属性来指定特定的查询集。serializer_class
:一个序列化器类,用于序列化和反序列化模型对象。可以在子类中重写该属性以使用自定义的序列化器。create
:创建新的模型对象的方法,默认实现使用传入的数据创建新的对象,并将其保存到数据库中。list
:获取所有模型对象的方法,默认实现返回模型对象的列表。retrieve
:获取单个模型对象的方法,默认实现根据传入的参数获取特定的模型对象并返回。update
:更新模型对象的方法,默认实现根据传入的参数查找特定的模型对象,并使用传入的数据进行更新。partial_update
:部分更新模型对象的方法,默认实现根据传入的参数查找特定的模型对象,并使用传入的部分数据进行更新。destroy
:删除模型对象的方法,默认实现根据传入的参数查找特定的模型对象,并将其从数据库中删除。
通过使用 viewsets.ModelViewSet
,你可以减少编写重复的代码,提高开发效率,并且得到符合 RESTful 风格的 API 结构。同时,你可以根据需要在子类中重写或添加其他方法来扩展和定制你的视图集合。
生成的 URL 模式如下:
- GET /projects/:列表操作,获取所有项目
- POST /projects/:创建操作,创建新的项目
- GET /projects/{pk}/:检索操作,获取特定项目
- PUT /projects/{pk}/:更新操作,更新特定项目
- PATCH /projects/{pk}/:部分更新操作,部分更新特定项目
- DELETE /projects/{pk}/:删除操作,删除特定项目
二、viewsets.ModelViewSet 应用
因为 ModelViewSet 扩展了 GenericAPIView,通常你至少需要提供 queryset 和 serializer_class 属性。例如:
from rest_framework import viewsets
from rest_framework.response import Response
from .serializers import ProjectsModelSerializer
from .models import Projects
from rest_framework.decorators import action
class ProjectsViewSet(viewsets.ModelViewSet):
queryset = Projects.objects.all()
serializer_class = ProjectsModelSerializer
其中:
- queryset 属性指定了要查询的数据集,
- serializer_class 属性指定了要使用的序列化器类,
2.1 自定义动态查询集
在上面的代码中,查询集 ,是固定写的。
queryset = Projects.objects.all()
我们可以通过重写get_queryset 方法,根据需要,自定义动态的查询集。
from rest_framework import viewsets
from rest_framework.response import Response
from .serializers import ProjectsModelSerializer
from .models import Projects
from rest_framework.decorators import action
class ProjectsViewSet(viewsets.ModelViewSet):
serializer_class = ProjectsModelSerializer
def get_queryset(self):
return Projects.objects.all()
上面的代码定义了一个 ProjectsViewSet 类。它是一个简单的 ViewSet,用于查看和编辑项目信息。
在这个示例中,我们重写了 get_queryset 方法。我们可以根据自己的逻辑来动态设置查询集,而不是固定使用预定义的 queryset 属性。
三、设置路由
# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 07 -04
# @File: urls.py
# desc:
from .views import ProjectsViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'projects', ProjectsViewSet, basename='projects')
urlpatterns = router.urls
四、启动项目
启动项目,查看接口。
python3 manage.py runserver
自动生成了增删改查的接口。