当前位置:首页 > 技术 > 正文内容

DRF 视图架构与使用实践

访客 技术 2026年8月9日 2

请求与响应机制

Request 对象由 DRF 扩展自 Django 原生的 HttpRequest,具备自动解析请求体的能力。根据 Content-Type 头部,它会调用对应的解析器(如 JSON、Form 等)将数据转换为可操作的字典结构。

  • request.data:返回已解析后的请求体内容。
  • request.query_params:等价于 Django 的 request.GET,用于获取查询参数。

Response 类用于构建响应对象,支持灵活的数据渲染。其构造函数为:

Response(data, status=None, template_name=None, headers=None, content_type=None)
  • .data:待渲染的序列化数据(未处理)。
  • .status_code:HTTP 状态码数值。
  • .content:经过渲染后返回给客户端的实际内容。

视图类型与实现方式

APIView 基类

rest_framework.views.APIView 是所有视图的根类。开发者需手动定义 get()post() 等方法来处理不同请求类型。

class BookList(APIView):
    def get(self, request):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = BookSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

GenericAPIView 通用基类

继承自 APIView,提供数据库查询和序列化器管理的便捷接口,通常搭配 Mixin 使用。

  • queryset:指定模型查询集。
  • serializer_class:指定使用的序列化器类。
  • get_queryset():返回当前视图所用的查询集。
  • get_object():根据主键获取单个模型实例。
  • get_serializer():返回序列化器实例。

Mixin 扩展类

五个核心 Mixin 提供标准增删改查逻辑,可组合使用以减少重复代码:

  • ListModelMixin:实现列表展示(list())。
  • CreateModelMixin:实现创建资源(create())。
  • RetrieveModelMixin:实现详情获取(retrieve())。
  • UpdateModelMixin:实现完整更新(update())或部分更新(partial_update())。
  • DestroyModelMixin:实现删除操作(destroy())。

预定义子类视图

DRF 提供八种常用视图子类,封装了常见场景的逻辑:

  • CreateAPIView:仅支持 POST 创建。
  • ListAPIView:仅支持 GET 列表。
  • RetrieveAPIView:仅支持 GET 详情。
  • DestroyAPIView:仅支持 DELETE 删除。
  • UpdateAPIView:支持 PUTPATCH
  • RetrieveUpdateAPIView:支持 GETPUTPATCH
  • RetrieveUpdateDestroyAPIView:支持全部四种操作。

视图集(ViewSet)

ViewSet 基类

将一组相关操作集中在一个类中,通过 action 方法表达行为,而非直接绑定请求方法。例如:

class UserViewSet(viewsets.ViewSet):
    def list(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        user = get_object_or_404(User, pk=pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

GenericViewSet

整合 GenericAPIViewViewSetMixin,支持与 Mixin 组合使用,简化开发流程。

ModelViewSet 与 ReadOnlyModelViewSet

  • ModelViewSet:包含全部五种操作的完整视图集。
  • ReadOnlyModelViewSet:仅支持读取操作(列表与详情)。

自定义动作(Action)

可通过 @action 装饰器添加额外功能,如最新图书推荐或阅读量更新:

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    @action(methods=['get'], detail=False)
    def latest(self, request):
        book = BookInfo.objects.latest('id')
        return Response(BookInfoSerializer(book).data)

    @action(methods=['put'], detail=True)
    def read(self, request, pk):
        book = self.get_object()
        book.bread = request.data.get('bread', book.bread)
        book.save()
        return Response(BookInfoSerializer(book).data)

路由自动注册(Routers)

使用 routers.SimpleRouter 可自动生成标准 URL 模式:

router = routers.SimpleRouter()
router.register(r'books', BookInfoViewSet, basename='book')

# 自动生成:
# ^books/$ → name: book-list
# ^books/{pk}/$ → name: book-detail
# ^books/latest/$ → name: book-latest
# ^books/{pk}/read/$ → name: book-read

确保自定义 action 正确配置 detailmethods 参数,以便路由器正确生成路径。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。