viewsets.ModelViewSet详解

文章介绍了DjangoRestFramework中的ModelViewSet类,它提供了一种快速创建符合RESTful风格API视图集合的方式,包括创建、读取、更新、删除和列表等操作。ModelViewSet基于GenericAPIView和ModelMixin,允许开发者通过指定queryset和serializer_class属性来处理数据库模型。此外,文章还讨论了如何自定义查询集和如何设置路由来注册ViewSet。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关文章:

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 继承了 GenericAPIViewModelMixin,因此它包含了基本的 HTTP 请求方法(GETPOSTPUTPATCHDELETE)以及对数据库模型的操作方法。

  • 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

自动生成了增删改查的接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_喵酱_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值