Datawhale Django 后端开发入门 Task05 DefaultRouter、自定义函数

一、DefaultRouter是Django REST framework中提供的一个路由器类,用于自动生成URL路由。路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由,从而减少了手动编写URL路由的工作量。

  1. 使用方法

导入DefaultRouter类,实例化一个router,然后使用router.register()方法注册视图集:

python 复制代码
from rest_framework import routers

router = routers.DefaultRouter()

router.register(r'users', UserViewSet)

这样就可以自动为UserViewSet生成URLConf了。

  1. 工作原理

DefaultRouter内部实现了一个register方法,它会去分析传入的视图集,获取它的一些属性如queryset、serializer_class等。

根据这些信息,DefaultRouter会为这个视图集生成5种默认的URL模式:

  • list - 获取视图集queryset的列表数据

  • detail - 获取queryset单个对象的数据

  • create - 创建新的对象

  • update - 更新对象

  • partial_update

  • 更新对象的部分字段这简化了视图集与URL之间的绑定,开发者只需要编写视图集类,而URLConf可以自动生成。

  1. 自定义扩展

DefaultRouter也支持自定义路由方式,可以通过重写路由器的get_urls方法来实现。所以DefaultRouter为DRF的视图集提供了便捷的自动URL绑定方式,减少了重复劳动,是DRF框架的一个很好的设计。

4.在本次案例中的应用(可与以上进行对比)

urls.py

python 复制代码
from django.contrib import admin
from django.urls import path
from apps.erp_test.views import *

from rest_framework import routers

router = routers.DefaultRouter()
router.register('GoodsCategory', GoodsCategoryViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('filtergoodscategory/', FilterGoodsCategory),
    path('insertgoodscategory/', InsertGoodsCategory),
    path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
    path('getgoods/', GetGoods.as_view()),
]


urlpatterns += router.urls

使用routers.DefaultRouter()​创建了一个默认的路由器对象,并使用router.register()​方法注册了一个视图集,GoodsCategoryViewSet​。这样可以自动为这个视图集生成对应的URL路由,并将其添加到urlpatterns​中。

(1. 创建DefaultRouter实例

python 复制代码
router = routers.DefaultRouter()

这里实例化了默认的路由器。

(2. 注册视图集

python 复制代码
router.register('GoodsCategory', GoodsCategoryViewSet)

使用register方法注册了GoodsCategory视图集。

(3. 包含自动生成的URL

python 复制代码
urlpatterns += router.urls

自动将路由器生成的URL模式包含到urlpatterns中。这样,DefaultRouter会根据GoodsCategoryViewSet的信息,自动生成一组CRUD URL模式:

  • /GoodsCategory/ - 名为GoodsCategory的endpoint

  • GET /GoodsCategory/ - 查询所有分类

  • POST /GoodsCategory/ - 新增分类

  • GET /GoodsCategory/{pk}/ - 根据主键获取单个分类

  • PUT /GoodsCategory/{pk}/ - 更新整个分类

  • PATCH /GoodsCategory/{pk}/ - 更新部分分类

  • DELETE /GoodsCategory/{pk}/ - 删除分类

开发者只需要编写视图集逻辑,URL定义都由DefaultRouter自动完成了。这种设计很好地体现了DRF框架的优势,可以快速高效地开发API。

二、自定义函数

@action 是 Django REST framework 中的一个装饰器,用于将自定义函数转换为视图集的一个动作。@action 装饰器提供了一种定义自定义函数的方式,这些函数并不直接对应于标准的 CRUD 操作(Create-Read-Update-Delete),而是实现一些其他的自定义行为或业务逻辑。

使用这个装饰器的典型步骤是:

  1. rest_framework.decorators 中导入 @action 装饰器

  2. 定义一个自定义函数,实现特定的业务逻辑

  3. 使用 @action 装饰这个自定义函数

  4. 在视图集类中包含这个加了装饰器的自定义函数

  5. 这样这个自定义函数就成为了该视图集的一个动作操作

  6. 可以向标准的 CRUD 接口一样来调用这个自定义的操作接口@action 装饰器为 Django REST framework 提供了开箱即用的方式去扩展视图集,实现除了 CRUD 之外的其他自定义行为,非常方便和灵活。

python 复制代码
class GoodsCategoryViewSet(ModelViewSet):
    # 指定查询集(用到的数据)
    queryset = GoodsCategory.objects.all()
    # 指定查询集用到的序列化容器
    serializer_class = GoodsCategorySerializer

    @action(detail=False, methods=['get'])
    def latest(self, request):
        latest_obj = GoodsCategory.objects.latest('id')
        print(latest_obj)
        return Response("helllo 你调用了自定义的函数")

这段代码定义了一个GoodsCategoryViewSet视图集,并使用@action装饰器添加了一个自定义的latest操作。

  1. 首先定义了queryset和serializer_class,指定了该视图集要操作的模型和序列化类。

  2. 然后使用@action装饰器定义了latest方法,并指定它响应GET请求。

  3. latest方法中,查询了id最大(最新的)的一个GoodsCategory对象。

  4. 打印了该对象,并返回一个响应。

  5. 这样就定义好了latest自定义操作。

  6. 可以通过类似"/goods_categories/latest/"的URL来调用这个操作。

  7. @action装饰器实现了在不修改视图集类的情况下,添加自定义行为的方式。

  8. 使代码更清晰,也方便重用。

所以@action是DRF提供的非常有用的装饰器,可以提高视图集扩展性和灵活性。

相关推荐
红尘散仙2 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
心中有国也有家2 小时前
GE图引擎深度解析——CANN的计算图优化与执行引擎
人工智能·pytorch·python·学习·numpy
卷毛的技术笔记4 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥4 小时前
匿名函数 lambda + 高阶函数
java·python·算法
vb2008114 小时前
FastAPI APIRouter
开发语言·python
会编程的土豆4 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
adrninistrat0r4 小时前
Java调用链MCP分析工具
java·python·ai编程
喵个咪4 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
杨充4 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
basketball6165 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang