一、 从前我们写视图像在搬砖
记得我刚接触Django时,写视图函数写到怀疑人生。每个功能都要写对应的视图,增删改查四个操作就得写四个视图,配置URL时还要绞尽脑汁想命名,代码重复得让人想哭。
特别是做运维监控系统的时候,各种资源需要API:服务器列表、监控指标、告警记录……每个模型都得来一套CRUD。那段时间,我感觉自己就是个代码搬运工,整天在复制粘贴。
直到我遇到了ViewSets和Routers,才发现原来Django可以这么优雅!ViewSets就像是把相关的视图打包成一个“全家桶”,而Router则是个聪明的快递员,自动帮你把请求送到对应的处理函数。
举个栗子,传统方式写个服务器列表的API,你得这样:
# 以前的笨办法
from django.http import JsonResponse
from .models import Server
def server_list(request):
servers = Server.objects.all()
data = [{'name': s.name, 'ip': s.ip} for s in servers]
return JsonResponse(data, safe=False)
def server_detail(request, pk):
server = Server.objects.get(pk=pk)
data = {'name': server.name, 'ip': server.ip}
return JsonResponse(data)
然后还要在urls.py里配置两个URL路径……就为了一个简单的列表和详情查询!
二、 ViewSets:把视图打包成“全家桶”
2.1 什么是ViewSets?
简单说,ViewSets就是把多个视图的逻辑集合到一个类里面。想象一下,你去快餐店点套餐,不用单独点汉堡、薯条、可乐,直接说“要个一号套餐”就行了。ViewSets就是Django里的“套餐”。
2.2 两种ViewSets,总有一款适合你
ModelViewSet - 懒人终极武器
如果你要做完整的CRUD(增删改查),用这个就对了:
from rest_framework import viewsets
from .models import Server
from .serializers import ServerSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
就这?对,就这4行代码!它自动给你提供了list(列表)、create(创建)、retrieve(详情)、update(更新)、partial_update(部分更新)、destroy(删除)六个操作。
ReadOnlyModelViewSet - 只读的乖宝宝
运维场景下,很多数据我们只需要读,不需要修改:
class MonitorDataViewSet(viewsets.ReadOnlyModelViewSet):
queryset = MonitorData.objects.all()
serializer_class = MonitorDataSerializer
这个只提供list和retrieve操作,适合展示监控数据、日志记录等只读场景。
三、 Routers:自动导航的智能快递员
3.1 为什么需要Router?
有了ViewSets这个“全家桶”,还得有个聪明的“服务员”把客户的请求准确送到对应操作。Router就是这个服务员。
传统配置URL的方式:
# 以前的繁琐方式
urlpatterns = [
path('servers/', server_list, name='server-list'),
path
Django ViewSets与Routers高效实践

最低0.47元/天 解锁文章
542

被折叠的 条评论
为什么被折叠?



