路由
# 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