drf:路由

本文介绍了Django Rest Framework(DRF)中的路由注册,包括DefaultRouter和SimpleRouter的使用。DefaultRouter提供了列表和详情路由,并支持.json格式和调试界面,而SimpleRouter仅包含基本的列表和详情路由。此外,还讲解了如何通过action装饰器自定义视图接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

我们在使用视图集的过程中,要对路由进行映射,当扩展方法过多时,路由会写的很长,如下:

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类型数据:
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来看一下效果:
postman

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值