DRF的ViewSet使用方式

在 Django Rest Framework(DRF)中,ViewSet 是一个非常重要的组件,用于简化常见的数据库操作,如增删改查(CRUD)。ViewSet 基本上是一个处理 HTTP 请求的类,它自动为你提供了一些常用的动作,比如列出、创建、更新和删除资源。

基本概念

  • ViewSet 是 DRF 中的一种视图,它会自动为模型提供基本的 CRUD 操作。
  • ViewSet 通常和 Router 配合使用,Router 会根据你定义的动作自动生成 URL 路径。

常见的 ViewSet 类型

  1. ModelViewSet:提供了最常用的 CRUD 操作,通常用于与 Django 的模型相关联。
  2. ReadOnlyModelViewSet:只提供读取操作(list 和 retrieve),不支持修改数据。

示例:创建一个简单的 ModelViewSet

假设我们有一个 Book 模型,需要对其进行基本的 CRUD 操作:

1. 创建模型(models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

2. 创建序列化器(serializers.py

serializers.py 中,你需要为 Book 模型创建一个序列化器,用来将模型实例转换为 JSON 格式(以及反向转换)。

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

3. 创建 ViewSet(views.py

接下来,我们可以创建一个 ModelViewSet,它会自动为 Book 模型提供基本的 CRUD 操作。

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()  # 设置查询集
    serializer_class = BookSerializer  # 设置序列化器

4. 配置 URL 路由(urls.py

为了将 ViewSet 和 URL 路由连接起来,我们使用 DRF 的 Router 来自动生成路由。

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import BookViewSet

# 创建路由
router = DefaultRouter()
router.register(r'books', BookViewSet)  # 注册 BookViewSet

urlpatterns = [
    path('', include(router.urls)),  # 包含路由
]

结果

通过上述步骤,DRF 会自动为你生成以下 API 路由:

  • GET /books/:列出所有书籍(list)。
  • POST /books/:创建一本新书(create)。
  • GET /books/{id}/:获取单本书籍的详细信息(retrieve)。
  • PUT /books/{id}/:更新书籍(update)。
  • PATCH /books/{id}/:部分更新书籍(partial_update)。
  • DELETE /books/{id}/:删除书籍(destroy)。

自定义 ViewSet 动作

有时候,默认的 CRUD 操作不满足你的需求,你可以在 ViewSet 中自定义一些动作。比如:

from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # 自定义一个动作:获取书籍的统计信息
    @action(detail=False, methods=['get'])
    def statistics(self, request):
        total_books = Book.objects.count()
        return Response({'total_books': total_books})

这个自定义动作会创建一个新的路由,GET /books/statistics/,用来返回书籍的统计信息。

总结

  • ModelViewSet:DRF 提供的视图集,可以为你的模型自动生成常用的 CRUD 操作。
  • Router:通过 Router 自动生成 URL 路由,简化了路由配置。
  • 自定义动作:你可以在 ViewSet 中定义额外的业务逻辑动作,比如上面的 statistics。

DRF 的 ViewSetRouter 配合使用,大大简化了 API 的开发,减少了重复代码,适合快速构建 RESTful API。如果你有更具体的问题或需要进一步的代码示例,随时告诉我!


文章标签:

评论(0)