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

相关推荐
泡泡鱼(敲代码中)28 分钟前
Python 字符串 str 完整学习笔记
python·学习
troy12837 分钟前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
我不会起名字3221 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
ThornArmor2 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
毕业设计7032 小时前
(免费领源码)基于Python的博物馆研学活动管理系统的设计与实现22724- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
python·mysql·随机森林·pycharm·django·flask·推荐算法
苏三说技术2 小时前
为什么越来越多人用OpenWiki?
后端
kyrie_sakura2 小时前
python学习笔记15 -- Anaconda,Jupyter,numpy
python·学习·jupyter·numpy
IT_陈寒2 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet2 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
测试老哥2 小时前
接口测试的测试用例应该怎么写?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试