DRF框架--视图集中新增额外行为
视图集: ViewSet,GenericViewSet,ModelViewSet
视图集增加额外行为,比如增加查询最新的一本图书信息:
class BookViewSet(ModelViewSet) '''视图集''' queryset = BookInfo.objects.all() serializer_class = BookInfoModelSerializer def latest(self,request): '''返回最后一本图书信息''' book = BookInfo.objects.latest('id') serializer = self.get_serializer(book) return Response(serializer.data)
def read(self,request,pk): '''修改图书的阅读量数据''' book = self.get_object() book.read = request.data.get('bread') book.save() serializer = self.get_serializer(book) return Response(serializer.data)
路由页面:(适用视图类,非视图集)
urlpatterns = [ # 列表视图的路由GenericAPIView,只要是继承了这个视图类,都可以使用这种形式的路由 url(r'^books/$',views.BookViewSet.as_view({'get':'list','post':'create'})), # 详情视图的路由 url(r'^books/(?P\d+)/read/$',views.BookViewSet.as_view({'get':'retrieve','put':'update','delete':'destory'})), # 如果在增删改查之外额外增加行为,应该单独定义路由 # 如果此行为不需要pk,那么它就是列表视图,但是列表视图默认只有list和create,因此需要暴露你的行为:latest
url(r'^books/latest$'),views.BookViewSet.as_view({'get':'latest'}) # 比如我们在增加一个修改阅读量的行为,是需要传入pk值的 url(r'^books/(?P<pk>\d+)/read$'),views.BookViewSet.as_view({'put':'read'}) ]
路由页面(使用视图集,非视图类):
# 首先 视图页面需要加入@action修饰
class BookViewSet(ModelViewSet) '''视图集''' queryset = BookInfo.objects.all() serializer_class = BookInfoModelSerializer @action(methods=['get'],detail=False) # 指定行为接收什么请求,以及是否是详情类请求books/latest def latest(self,request): '''返回最后一本图书信息''' book = BookInfo.objects.latest('id') serializer = self.get_serializer(book) return Response(serializer.data) @action(methods=['put'],detail=True) # 是否是详情类请求books/pk/read def read(self,request,pk): '''修改图书的阅读量数据''' book = self.get_object() book.read = request.data.get('bread') book.save() serializer = self.get_serializer(book) return Response(serializer.data)
# 路由页面
url = [] router = DefaultRouter() # 创建路由器(路由器只能结合视图集一起使用),默认只为标准增删改查行为生成路由信息,其他行为,需要在视图集中加@action装饰器 router.register(r'book',views.BookViewSet) # 注册路由 urlpatterns += router.urls # 把生成好的路由拼接到urlpatterns
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通