Django rest framework 自定义url

一、自定义增删改查外的方法和路由

使用 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 中的 CreateModelMixin RetrieveModelMixin UpdateModelMixin DestroyModelMixin ListModelMixin 五个方法来自定义。还需要在继承 '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 对应的是方法的名字

相关推荐
迷藏4944 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
明日清晨35 分钟前
python扫码登录dy
开发语言·python
bazhange1 小时前
python如何像matlab一样使用向量化替代for循环
开发语言·python·matlab
人工干智能1 小时前
科普:python中你写的模块找不到了——`ModuleNotFoundError`
服务器·python
新知图书1 小时前
搭建Spring Boot开发环境
java·spring boot·后端
unicrom_深圳市由你创科技1 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
小敬爱吃饭1 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
宸津-代码粉碎机1 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
知行合一。。。2 小时前
Python--04--数据容器(集合)
python
Captain_Data2 小时前
Python机器学习sklearn线性模型完整指南:LinearRegression/Ridge/Lasso详细代码注释
python·机器学习·数据分析·线性回归·sklearn