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提供的非常有用的装饰器,可以提高视图集扩展性和灵活性。

相关推荐
wt_cs15 分钟前
银行回单ocr api集成解析-图像文字识别-文字识别技术
开发语言·python
_WndProc37 分钟前
【Python】Flask网页
开发语言·python·flask
互联网搬砖老肖39 分钟前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
深栈解码41 分钟前
JMM深度解析(三) volatile实现机制详解
java·后端
张家宝68371 小时前
ambari
后端
测试者家园1 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
StephenCurryFans1 小时前
Spring AI vs LangChain4j:Java AI开发框架完整对比指南 🚀
后端·spring
程序员辉哥1 小时前
学会在Cursor中使用Rules生成代码后可以躺平了吗?
前端·后端
大模型真好玩1 小时前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
Brookty1 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc