drf路由
路由
# 继承了ViewSetMixin和GenericAPIView和类可以使用drf提供了路由系统,自动生成url,
# 也可以说继承了视图集GenericViewSet的子类都可以使用路由系统
# 需要注意,此时默认通过actions分配的请求方法是五个视图扩展类的方法
# 所以简便使用路由系统时最好搭配五个视图扩展类,也可以自己实现,如list方法
# 使用方法:
# views.py中的视图类满足继承要求,视图集合类
# urls.py
1:导入routers模块
from rest_framework import routers
2:通过两个类中的一个实例化对象
routers.DefaultRouter 生成的路由个数更多[华而不实]
routers.SimpleRouter 个人推荐
router = routers.SimpleRouter()
3:注册
# router.register('前缀','继承自ModelViewSet视图类','别名')
router.register('books', views.BookViewSet) # 不要加斜杠了
4:增加到urlpattern中
# router.urls # 自动生成的路由,两条
urlpatterns += router.urls
代码实现
# views.py
class BookModelViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = ser.BookModelSerializer
def list(self, request, *args, **kwargs):
book_list = self.get_queryset()[:3]
ser_obj = self.get_serializer(book_list, many=True)
return Response(ser_obj.data)
# urls.py
# 第一步
from rest_framework import routers
from app01 import views
# 第二步
router = routers.SimpleRouter()
# 第三步
router.register(prefix='books', viewset=views.BookModelViewSet)
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
# 第四步
urlpatterns += router.urls
# 新增的两条url
print(router.urls)
[
<RegexURLPattern book-list ^books/$>,
<RegexURLPattern book-detail ^books/(?P<pk>[^/.]+)/$>
]
action装饰器
# 用途
为了给继承自ModelViewSet的视图类中定义的函数也添加路由
# 使用
from rest_framework.decorators import action
class BookModelViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = ser.BookModelSerializer
@action(methods=['get'], detail=False)
def get_top3(self, request):
print(request.user.username)
book_list = self.get_queryset()[:3]
ser_obj = self.get_serializer(book_list, many=True)
return Response(ser_obj.data)
# 参数说明:
methods参数赋值一个列表,放可以访问该方法的请求方式
detail参数是布尔值:
detail=False表示方法是不使用pk;^books/get_top3/$
反之使用pk参数;^books/(?P<pk>[^/.]+)/get_top3/$
# 总结:action装饰器,放在被装饰的函数上方,method:请求方式,detail:是否带pk