文章目录
- [【Django】 Task5 DefaultRouter路由组件和自定义函数](#【Django】 Task5 DefaultRouter路由组件和自定义函数)
【Django】 Task5 DefaultRouter路由组件和自定义函数
Task5 主要了解了DefaultRouter路由组件,Django REST framework(DRF)是一个强大且灵活的 Django 插件,用于开发 Web API。并且掌握通过@action进行自定义函数。
写在最后
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 愉快的打卡时间过得飞快,再次感谢DataWhale全体工作人员的辛勤付出,让我们聚在一块学习、一块进步、一块成长,笔芯~ 在这次活动中也认识了很多有趣的小伙伴,队长Puppet总是在群里第一时间分享自己的学习博客,总是提醒我们记得打卡,蟹蟹队长。也认识了超爱学习的小蜗牛,短短几个小时的交流过程中,发现她有对问题思考、并且学习态度一丝不苟,凌晨两点多还在写博客总结学习笔记。 终点很远,坚定前行,感受沿途风景,最后会有收获的。 ------cheunghonghui 2023.08.22 |
1.路由组件
1.1路由组件介绍
Django REST framework(DRF)是一个强大且灵活的 Django 插件,用于开发 Web API。它提供了一系列工具和组件,帮助您轻松地构建、发布和管理 API。其中,路由组件是 DRF 的一个关键特性,用于将视图函数映射到 URL,使得 API 的 URL 结构更加清晰和可维护。
DRF 的路由组件主要由两个类组成:SimpleRouter 和 DefaultRouter。这些类使您能够自动生成 URL 配置,而无需手动编写 URL 模式。
使用这些路由器,您可以将视图集映射到 URL,从而定义 API 的 URL 结构。Django REST framework 会自动为每个视图集生成适当的 URL 模式,减少了手动配置 URL 的工作。
总之,Django REST framework 的路由组件是一种用于管理 API URL 结构的强大工具,它能够根据视图集自动生成 URL 配置,使得 API 的开发变得更加高效和可维护。
1.2SimpleRouter
SimpleRouter
: SimpleRouter 是一个基本的路由器,用于自动生成 CRUD(创建、读取、更新、删除)操作的 URL 配置。您只需将视图集类传递给路由器,它将自动生成适当的 URL 配置。
python
from rest_framework.routers import SimpleRouter
from .views import BookViewSet
router = SimpleRouter()
router.register(r'books', BookViewSet)
urlpatterns = router.urls
1.3DefaultRouter
DefaultRouter
: DefaultRouter 是一个稍微高级的路由器,除了 CRUD 操作,它还支持额外的路由配置,如 list, create, retrieve, update, partial_update, destroy 和自定义操作。它还提供了根视图和 API 登录视图。
python
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = router.urls
1.4DefaultRouter示例
使用 DefaultRouter 时,它会自动生成一组默认的 URL 配置,涵盖了视图集中的 CRUD 操作以及一些额外的自定义操作。以下是使用 DefaultRouter 后生成的默认 URL 访问方式:
假设我们有一个 BookViewSet 视图集,用于处理图书数据:
python
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
通过使用 DefaultRouter 将 BookViewSet 注册到路由器中:
python
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r'books', BookViewSet)
生成的默认 URL 访问方式如下:
列表(List): 列出所有图书
URL:/books/
方法:GET
视图函数:list()
创建(Create): 创建新图书
URL:/books/
方法:POST
视图函数:create()
详情(Retrieve): 获取单个图书的详细信息
URL:/books/{pk}/
方法:GET
视图函数:retrieve()
更新(Update): 更新图书的详细信息
URL:/books/{pk}/
方法:PUT
视图函数:update()
部分更新(Partial Update): 部分更新图书的详细信息
URL:/books/{pk}/
方法:PATCH
视图函数:partial_update()
删除(Destroy): 删除图书
URL:/books/{pk}/
方法:DELETE
视图函数:destroy()
除了这些默认的 CRUD 操作外,还可以使用自定义操作,如 list, create, retrieve, update, partial_update, destroy 以及您在视图集中定义的其他自定义操作。这些操作的 URL 也会根据视图集的配置生成。
1.5查看访问服务接口url
在 Django 中,您可以从多个位置获取有关访问的 URL 的信息,特别是在使用 Django REST framework(DRF)创建 Web API 时。以下是一些常见的方法来了解 URL 信息:
路由配置文件
: 在 Django 项目的主 urls.py 文件中,您可以查看路由配置以了解所有的 URL。这是定义 URL 路由和视图的地方。
Django REST framework 路由器
: 如果在 DRF 中使用了路由器(如 DefaultRouter 或 SimpleRouter),它会自动生成 URL 配置。您可以在路由器的文档或代码中查找生成的 URL。
Django Debug Toolbar
: 如果在开发环境中使用了 Django Debug Toolbar,它会显示每个请求的详细信息,包括访问的 URL 和执行的视图。
Django Shell
: 您可以在 Django 的交互式 shell 中导入路由配置,并查看生成的 URL。例如,使用 reverse() 函数来查找 URL 的反向映射。
命令行工具
: 如果使用 Django 的命令行工具来运行开发服务器,它通常会在控制台中显示正在监听的端口和 URL。
Django REST framework 的 API 浏览器
: DRF 提供了一个内置的 API 浏览器,它可以让您通过 Web 界面浏览和测试 API。您可以在浏览器中查看 URL 和执行请求。
文档和注释
: 有时,您可以从代码中的文档字符串、注释或文档中找到有关特定 URL 的信息。
总的来说,了解访问的 URL 可以通过查看路由配置、工具和文档等方式来实现。选择最适合您当前环境和需求的方法,以获取所需的 URL 信息。
2.自定义函数
在 Django REST framework(DRF)中,@action 装饰器用于在视图集(Viewset)中定义自定义的操作,这些操作不属于标准的 CRUD 操作(例如列表、创建、获取、更新、删除)。使用 @action 装饰器,您可以将额外的自定义操作添加到视图集中,从而实现特定的业务逻辑。
@action 装饰器的常见用法是在视图集中添加额外的 HTTP 方法,以处理特定的操作。这些自定义操作会映射到视图集的方法,并且可以通过 API 的 URL 进行访问。
以下是一个使用 @action 装饰器的简单示例:
python
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
@action(detail=False, methods=['GET'])
def popular_books(self, request):
# Custom logic to retrieve popular books
popular_books = self.queryset.filter(rating__gte=4)
serializer = self.get_serializer(popular_books, many=True)
return Response(serializer.data)
在这个示例中,popular_books 是一个自定义的操作,它会返回所有评分大于等于 4 的热门图书。通过将 @action 装饰器应用于视图函数上,我们可以将这个操作映射到视图集中,使其可以通过 /books/popular_books/ URL 进行访问。
在 @action 装饰器中,您可以使用以下参数:
- detail:布尔值,指示操作是否应该针对单个对象(True)还是整个集合(False)。默认为 True。
- methods:一个包含允许的 HTTP 方法的列表,如 ['GET', 'POST']。
- url_path:自定义操作的 URL 路径部分。
- url_name:自定义操作的 URL 名称。
其他视图函数的参数,如 request 和 pk。
通过 @action 装饰器,您可以轻松地扩展您的 DRF 视图集,添加自定义操作,以满足特定的业务需求。