一、介绍
我们在使用视图集的过程中,要对路由进行映射,当扩展方法过多时,路由会写的很长,如下:
urlpatterns = [
path('bookinfo/',BookOperation.as_view({'get':'list','post':'create'})),
re_path(r'bookinfo/(?P<pk>\d+)/',BookOperation.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
]
故我们引入drf的路由注册功能:DefaultRouter及SimpleRouter
二、DefaultRouter
我们使用DefaultRouter对路由进行改写:
from django.urls import path,re_path
from rest_framework.routers import DefaultRouter,SimpleRouter
from .views import BookOperation
urlpatterns = [
# path('bookinfo/',BookOperation.as_view({'get':'list','post':'create'})),
# re_path(r'bookinfo/(?P<pk>\d+)/',BookOperation.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
]
# 创建路由对象
router = DefaultRouter()
# 注册视图集
urlpatterns += router.urls
# 输出结果
print(urlpatterns)
我们来看看打印结果:
[
<URLPattern '^book/$' [name='bookinfo-list']>,
<URLPattern '^book\.(?P<format>[a-z0-9]+)/?$' [name='bookinfo-list']>,
<URLPattern '^book/(?P<pk>[^/.]+)/$' [name='bookinfo-detail']>,
<URLPattern '^book/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='bookinfo-detail']>,
<URLPattern '^$' [name='api-root']>,
<URLPattern '^\.(?P<format>[a-z0-9]+)/?$' [name='api-root']>
]
如上,两个列表路由,两个详情路由,以及两个根路由,根据正则匹配规则,我们可以在浏览器中使用.json获取json类型数据:
路由注册后,restful给我们提供了浏览器可访问的调试界面,可进行增删改查操作:
根路由:
列表路由:
1、get
2、create
详情路由:
三、SimpleRouter
Simple只提供了一个列表路由和一个详情路由:
from django.urls import path,re_path
from rest_framework.routers import DefaultRouter,SimpleRouter
from .views import BookOperation
urlpatterns = [
# path('bookinfo/',BookOperation.as_view({'get':'list','post':'create'})),
# re_path(r'bookinfo/(?P<pk>\d+)/',BookOperation.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
]
# 创建路由对象
router = SimpleRouter()
# 注册视图集
router.register("book",BookOperation,"bookinfo")
urlpatterns += router.urls
# 输出结果
print(urlpatterns)
输出结果:
[
<URLPattern '^book/$' [name='bookinfo-list']>,
<URLPattern '^book/(?P<pk>[^/.]+)/$' [name='bookinfo-detail']>
]
在浏览器中无法获取json数据,无法访问根路径。
四、自定义视图路由action
如果我们需要自定义一个视图接口,那么我们需要添加action装饰器来将其注册到路由中
from rest_framework.response import Response
from rest_framework.mixins import CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
from rest_framework.viewsets import ModelViewSet
from .models import BookMessage
from rest_framework import status
from .serializer import BookSerializer
from rest_framework.decorators import action
# Create your views here.
class BookOperation(ModelViewSet):
queryset = BookMessage.objects.all()
serializer_class = BookSerializer
# 取出价格100元以上的书本
@action(methods=["GET"],detail=False)
def Book_price(self,request):
books = BookMessage.objects.filter(price__gt=100)
serializer = self.get_serializer(instance=books,many=True)
return Response(serializer.data)
# 更改价格
@action(methods=["PUT"],detail=True)
def Change_price(self,request,pk):
data = request.data
book = self.get_object()
serializer = self.get_serializer(instance=book,data=data,partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data)
输出结果:
[
<URLPattern '^book/$' [name='bookinfo-list']>,
<URLPattern '^book/Book_price/$' [name='bookinfo-Book-price']>,
<URLPattern '^book/(?P<pk>[^/.]+)/$' [name='bookinfo-detail']>,
<URLPattern '^book/(?P<pk>[^/.]+)/Change_price/$' [name='bookinfo-Change-price']>
]
我们使用postman来看一下效果: