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

 

posted @   EricYJChung  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示