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

相关推荐
范中勤几秒前
LangGraph Checkpointer 封装(下):with 的双层上下文与 MemorySaver 为什么不用 with
python·大模型·llm·agent·langgraph
鸿业远图科技5 分钟前
丹东市_公交线
python
Wx-bishekaifayuan8 分钟前
springboot铜仁非遗之家76938-计算机课程设计、毕业设计
java·spring boot·后端·spring·django·课程设计·旅游
唐青枫12 分钟前
薛定谔的猫详解:一只猫如何揭开量子测量之谜
后端
锋行天下14 分钟前
langgraph 循环节点的静态和动态实现
前端·后端
打工仔折腾 AI24 分钟前
在线PDF工具隐私焦虑?把BentoPDF部署到极空间NAS本地处理
人工智能·后端·python·pdf·ai agent 实战
2603_9651481134 分钟前
商品价格监控 API 接口:从原理到实战的完整指南
java·前端·数据库·python·生活
数字化转型分享点滴1 小时前
机加工MES落地先连设备还是先上工单?一份车间实施参考
python·安全
阿皮 API1 小时前
Shopee虾皮商品详情API接口调用实战:Python获取东南亚商品数据与JSON解析
开发语言·python·json
彭亚川Allen1 小时前
从零手搓 RAG 之文档解析技术
前端·后端·架构