rest_framework.routers 路由类的高级玩法
定义了一个名为BaseRouter的自定义路由器类,继承自Django REST framework中的SimpleRouter。这个路由器类提供了对视图集的标准CRUD操作的支持,并且允许通过@action装饰器在视图集中定义额外的动作
from rest_framework.routers import SimpleRouter, Route, DynamicRoute # 自定义路由器类,继承自SimpleRouter class BaseRouter(SimpleRouter): # 定义路由列表,包括静态和动态路由 routes = [ # 列表视图路由配置 Route( url=r'^{prefix}{trailing_slash}$', # URL模式,其中{prefix}是视图集的基本URL前缀,{trailing_slash}用于处理末尾斜杠 mapping={'get': 'list', # GET请求映射到视图集的list方法 'post': 'create' # POST请求映射到视图集的create方法 }, name='{basename}-list', # 路由名称模板,其中{basename}是视图集的基本名称 detail=False, # 标识这是列表视图(非详情视图) initkwargs={'suffix': 'List'} # 初始化关键字参数,后缀为'List' ), # 动态生成的列表视图路由,通过@action(detail=False)装饰器在视图集中定义的方法生成 DynamicRoute( url=r'^{prefix}/{url_path}{trailing_slash}$', # URL模式,其中{url_path}是动作路径 name='{basename}-{url_name}', # 路由名称模板,其中{url_name}是动作名称 detail=False, # 标识这是列表视图(非详情视图) initkwargs={} # 初始化关键字参数为空 ), # 详情视图路由配置 Route( url=r'^{prefix}/(?P<pk>\d+){trailing_slash}$', # URL模式,其中(?P<pk>\d+)捕获主键ID mapping={ 'get': 'retrieve', # GET请求映射到视图集的retrieve方法 'put': 'update', # PUT请求映射到视图集的update方法 'patch': 'partial_update', # PATCH请求映射到视图集的partial_update方法 'delete': 'destroy' # DELETE请求映射到视图集的destroy方法 }, name='{basename}-detail', # 路由名称模板 detail=True, # 标识这是详情视图 initkwargs={'suffix': 'Instance'} # 初始化关键字参数,后缀为'Instance' ), # 动态生成的详情视图路由,通过@action(detail=True)装饰器在视图集中定义的方法生成 DynamicRoute( url=r'^{prefix}/(?P<pk>\d+)/{url_path}{trailing_slash}$', # URL模式 name='{basename}-{url_name}', # 路由名称模板 detail=True, # 标识这是详情视图 initkwargs={} # 初始化关键字参数为空 ), ] # 指定模块导出的内容 __all__ = [ 'SimpleRouter', 'BaseRouter', ]
在真实场景中,
BaseRouter 可以用于配置 Django REST Framework (DRF) 的视图集路由。以下是一个完整的示例,展示了如何定义一个视图集并使用 BaseRouter 来注册这些视图集。示例步骤
- 安装 Django 和 DRF:
确保你已经安装了 Django 和 Django REST Framework。如果没有安装,可以使用 pip 进行安装:pip install django djangorestfra
- 创建 Django 项目和应用:
创建一个新的 Django 项目和应用。django-admin startproject myproject cd myproject python manage.py startapp myapp
- 配置 settings.py:
在settings.py中添加rest_framework和你的应用到INSTALLED_APPS。INSTALLED_APPS = [ ... 'rest_framework', 'myapp', ]
- 定义模型:
在models.py中定义一个简单的模型。from django.db import models
class Item(models.Model):
name = models.CharField(max_length=100)
description = models.TextField() def __str__(self): return self.name - 创建序列化器:
在serializers.py文件中创建一个序列化器。from rest_framework import serializers
from .models import Item
class ItemSerializer(serializers.ModelSerializer):
class Meta: model = Item fields = '__all__' - 创建视图集:
在views.py文件中创建一个视图集。from rest_framework import viewsets
from .models import Item
from .serializers import ItemSerializer
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
# 添加自定义动作示例 @action(detail=True, methods=['post']

浙公网安备 33010602011771号