一:路由Routers
对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
from rest_framework import routers
REST framework提供了两个router
- SimpleRouter
- DefaultRouter
1. 使用方法
views.py:
from rest_framework.viewsets import ModelViewSet
from drf_routers import models
from drf_routers.ser import BookModelSerializer
class BookViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookModelSerializer
serializer.py:
from rest_framework import serializers
from drf_routers import models
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__' # 代表序列化Book的所有字段
urls.py
"""
1.导入routers模块
"""
from rest_framework import routers
"""
2.有两个类,实例化得到对象
router = routers.SimpleRouter
router = routers.DefaultRouter
"""
router = routers.SimpleRouter()
"""
3.注册
router.register(prefix, viewset, base_name)
prefix 该视图集的路由前缀
viewset 视图集
base_name 路由别名的前缀
"""
router.register('books', views.ModelViewSet, base_name='books')
"""
4.自动生成路由
router.urls
urlpatterns += router.urls
print(router.urls)
[
<RegexURLPattern books-list ^books/$>,
<RegexURLPattern books-detail ^books/(?P<pk>[^/.]+)/$>
]
"""
urlpatterns += router.urls
2. action的使用
action干什么用?
答:为了给继承自ModelViewSet的视图类中定义的函数也添加路由
在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action
装饰器。
action装饰器可以接收两个参数:
- methods: 声明该action对应的请求方式,列表传递
- datail:
声明该action的路径是否与单一资源对应,及是否是
xxx/<pk>/action方法名/
- True 表示路径格式是xxx/<pk>/action方法名/
- False 表示路径格式是xxx/action方法名/