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 对应的是方法的名字

相关推荐
日日大王学编程4 小时前
AI Agent 技术发展历程、演进逻辑与技术范式综述
人工智能·python
春涧草茶4 小时前
慢就是快16-1协程
开发语言·前端·python
Oiiouui5 小时前
linux服务器部署Logto后端与对应前端的实现
linux·服务器·前端·后端
shenlongproxy5 小时前
代理IP故障演练怎么做:注入怎么分档、恢复怎么判定
后端
知识搬运临时工5 小时前
Kafka 发 1 GiB 数据,用户态 CPU 只花 0.016 秒,总耗时反而慢了 11%
后端·kafka
wt95275 小时前
VMware 虚拟机磁盘扩容实战文档(Ubuntu 22.04 + LVM)
linux·后端
5233AI开发笔记5 小时前
API 返回 429:先区分限速、并发和配额,再决定是否重试
python
databook5 小时前
经常听到的透视表是干什么的?
python·数据分析·pandas
王中阳Go5 小时前
预算给够了,时间花错了地方:三跳链路给了 27 秒,实际只用掉 9 秒
人工智能·后端·性能优化
用户394995084635 小时前
文件变了,inotify 为什么没反应
后端