路由

路由

# 1 在url.py中配置
    path('books4/', views.Book4View.as_view()),
    re_path('books4/(?P<pk>d+)', views.Book4DetailView.as_view()),
    
# 2 一旦视图类,继承了ViewSetMixin,路由
    path('books5/', views.Book5View.as_view(actions={'get': 'list', 'post': 'create'})),
    # 当路径匹配,又是get请求,会执行Book5View的list方法
    re_path('books5/(?P<pk>d+)',
            views.Book5View.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

# 3 继承自ModelViewSet的路由写法(自动生成路由)
# 第一步:导入routers模块
from rest_framework import routers

# 第二步:有两个类,实例化得到对象
# routers.DefaultRouter  生成的路由更多
# routers.SimpleRouter

# router = routers.SimpleRouter()
router = routers.DefaultRouter()
# 第三步:注册
# router.register('前缀', '继承自ModelViewSet的视图类', '别名')
router.register('books', views.BookViewSet,)  # 不要加斜杠了

# 第四步:
# router.urls # 自动生成的路由,加入到原路由中
# print(router.urls)
# urlpatterns += router.urls
"""
[<URLPattern '^books/$' [name='book-list']>, 
<URLPattern '^books/(?P<pk>[^/.]+)/$' [name='book-detail']>]
"""

action的使用

# action干什么用?为了给继承自ModelViewSet的视图类中定义的函数也添加路由
# 使用
from rest_framework.decorators import action  # 装饰器

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    # methods第一个参数,传一个列表,列表中放请求方式
    # ^books/get_1/$ [name='book-get-1'] 当向这个地址发送get请求,会执行下面的函数
    # detail:布尔类型如果是True
    # detail=True(带pk的)/False(不带pk)
    # ^books/(?P<pk>[^/.]+)/get_1/$ [name='book-get-1']
    @action(methods=['get'], detail=True)
    def get_1(self, request, pk):
        print(pk)  # 1
        book = self.get_queryset()[:2]  # 从0开始截取一条
        ser = self.get_serializer(book, many=True)
        return Response(ser.data)
    
# 装饰器,放在被装饰的函数上方,method:请求方式,detail:是否带pk
原文地址:https://www.cnblogs.com/ZhZhang12138/p/14875847.html