一、自定义增删改查外的方法和路由
使用
from rest_framework.viewsets import GenericViewSet, ViewSet这两个模块。
示例:使用 GenericViewSet 以用户修改密码为例
python
# view.py
from rest_framework.viewsets import GenericViewSet
class CustomerOperation(GenericViewSet):
@action(detail=False, methods=['post'])
def set_password(self, request, pk):
return return_200(_('Successfully change password'))
# urls.py
from rest_framework import routers
router = routers.DefaultRouter()
router.register('', CustomerOperation)
urlpatterns = [
# 方法一
path('<str:pk>/', include(router.urls)),
# 方法二
path('<str:pk>/set_password', AloneCustomerOperation.as_view({'post': 'set_password'})),
]
定义 url 使用的提交类型,两种方法
方法一、@action(detail=False, methods=['post']) 修饰函数直接在方法前面定义提交方式即可。
方法二、path('<str:pk>/set_password', AloneCustomerOperation.as_view({'post': 'set_password'})), 定义url,set_password 是 url 要请求的方法,post 是请求的方式
区别:
方法一会自动把 view 类中标记 action 的所有方法自动生成路由。路由名就是方法名称。
方法二是当有一些个性化定义路由时使用
二、自定义 drf 中提供的 list create retrieve update destroy方法的路由
drf 提供两个类
ReadOnlyModelViewSet: 只有 Retrieve 和 List
ModelViewSet: 有 Create、Retrieve、Update、Destroy、List 方法当然也可以自定义想用的方法使用
from rest_framework import mixins中的CreateModelMixinRetrieveModelMixinUpdateModelMixinDestroyModelMixinListModelMixin五个方法来自定义。还需要在继承 'GenericViewSet'。
示例:
python
@method_decorator(name="retrieve", decorator=.....)
from rest_framework.viewsets import ReadOnlyModelViewSet
class AAAList(ReadOnlyModelViewSet):
serializer_class = AAASerializers
queryset = AAA.objects.all()
# 重构 list 也可以使用默认的 list
def list(self, request):
queryset = self.get_queryset()
serializer = CustomerProductTypeQuota(queryset, many=True)
return Response(serializer.data)
定义路由方式和上面相同
注意\color{red}{注意}注意:当使用method_decorator
和swagger_auto_schema 去修改 api 文档页面时 name 对应的是方法的名字