drf路由

路由

# 继承了ViewSetMixin和GenericAPIView和类可以使用drf提供了路由系统,自动生成url,
# 也可以说继承了视图集GenericViewSet的子类都可以使用路由系统
# 需要注意,此时默认通过actions分配的请求方法是五个视图扩展类的方法
# 所以简便使用路由系统时最好搭配五个视图扩展类,也可以自己实现,如list方法

# 使用方法:
# views.py中的视图类满足继承要求,视图集合类
# urls.py
1:导入routers模块
	from rest_framework import routers
2:通过两个类中的一个实例化对象
	 routers.DefaultRouter 生成的路由个数更多[华而不实]
      routers.SimpleRouter	个人推荐
      router = routers.SimpleRouter()
3:注册
	# router.register('前缀','继承自ModelViewSet视图类','别名')
     router.register('books', views.BookViewSet) # 不要加斜杠了
4:增加到urlpattern中
	# router.urls # 自动生成的路由,两条
	urlpatterns += router.urls

代码实现

# views.py
class BookModelViewSet(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = ser.BookModelSerializer

    def list(self, request, *args, **kwargs):
        book_list = self.get_queryset()[:3]
        ser_obj = self.get_serializer(book_list, many=True)
        return Response(ser_obj.data)

    
# urls.py
# 第一步
from rest_framework import routers
from app01 import views
# 第二步
router = routers.SimpleRouter()
# 第三步
router.register(prefix='books', viewset=views.BookModelViewSet)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]
# 第四步
urlpatterns += router.urls


# 新增的两条url
print(router.urls)
[
    <RegexURLPattern book-list ^books/$>, 
    <RegexURLPattern book-detail ^books/(?P<pk>[^/.]+)/$>
]

action装饰器

# 用途
	为了给继承自ModelViewSet的视图类中定义的函数也添加路由
# 使用
	from rest_framework.decorators import action
    class BookModelViewSet(ModelViewSet):

        queryset = models.Book.objects.all()
        serializer_class = ser.BookModelSerializer

        @action(methods=['get'], detail=False)
        def get_top3(self, request):
            print(request.user.username)
            book_list = self.get_queryset()[:3]
            ser_obj = self.get_serializer(book_list, many=True)
            return Response(ser_obj.data)
# 参数说明:
	methods参数赋值一个列表,放可以访问该方法的请求方式
    detail参数是布尔值:
    	detail=False表示方法是不使用pk;^books/get_top3/$
        反之使用pk参数;^books/(?P<pk>[^/.]+)/get_top3/$
        
# 总结:action装饰器,放在被装饰的函数上方,method:请求方式,detail:是否带pk
posted @ 2020-07-09 22:13  the3times  阅读(113)  评论(0编辑  收藏  举报