django 3.2.13
一、路由器
概念:此路由器写在urls.py里面,其能够有效减少代码量,特别是配合上一篇文章写的视图集效果特别好
导入:from rest_framework import routers
1. 基础
原生url=路由器url
urlpatterns = [
path("teachers", views.TestGenericAPIView.as_view({'get':'list'})),
path("teachers/<pk>", views.TestGenericAPIView.as_view({'get':'retrieve'})),
]
路由器url=原生url
router = routers.SimpleRouter()
router.register(r'teachers', views.TestGenericAPIView, basename='lop')
urlpatterns += router.urls
2. 自定义
重点:@action(methods=['get'], detail=False) #detail表示是否带查询参数
,这个需要把前面的代码加到views.py
视图里面才能生效
导入:from rest_framework.decorators import action
2.1不带参数
原生url=路由器url
urlpatterns = [
path("teachers", views.TestGenericAPIView.as_view({'get':'list'})),
path("teachers/lastsome", views.TestGenericAPIView.as_view({'get':'lastsome'})),# 自己定义的
path("teachers/<pk>", views.TestGenericAPIView.as_view({'get':'retrieve'})),
]
路由器url=原生url
router = routers.SimpleRouter()
router.register(r'teachers', views.TestGenericAPIView, basename='lop')
urlpatterns += router.urls
class TestGenericAPIView(ReadOnlyModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
@action(methods=['get'], detail=False) #关键点
def lastsome(self, request):
data = Student.objects.get(id=7)
serializer = StudentSerializer(instance=data)
a = serializer.data
a.pop('time')
return Response(a)
2.2带参数
原生url=路由器url:
urlpatterns = [
path("teachers", views.TestGenericAPIView.as_view({'get':'list'})),
path("teachers/<pk>/lastsome", views.TestGenericAPIView.as_view({'get':'lastsome'})),
path("teachers/<pk>", views.TestGenericAPIView.as_view({'get':'retrieve'})),
]
路由器url=原生url
router = routers.SimpleRouter()
router.register(r'teachers', views.TestGenericAPIView, basename='lop')
urlpatterns += router.urls
class TestGenericAPIView(ReadOnlyModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
@action(methods=['get'], detail=True) #关键点
def lastsome(self, request, pk):
data = Student.objects.get(id=pk)
serializer = StudentSerializer(instance=data)
a = serializer.data
a.pop('time')
return Response(a)