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 来注册这些视图集。

示例步骤

  1. 安装 Django 和 DRF:
    确保你已经安装了 Django 和 Django REST Framework。如果没有安装,可以使用 pip 进行安装:
    pip install django djangorestfra
    

      

  2. 创建 Django 项目和应用:
    创建一个新的 Django 项目和应用。
    django-admin startproject myproject cd myproject python manage.py startapp myapp
    

      

  3. 配置 settings.py:
    在 settings.py 中添加 rest_framework 和你的应用到 INSTALLED_APPS
    INSTALLED_APPS = [ ... 'rest_framework', 'myapp', ]
    

      

  4. 定义模型:
    在 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

      

  5. 创建序列化器:
    在 serializers.py 文件中创建一个序列化器。
    from rest_framework import serializers 
    from .models import Item
    class ItemSerializer(serializers.ModelSerializer):
    class Meta: model = Item fields = '__all__'

      

  6. 创建视图集:
    在 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']

      

posted @ 2025-05-13 09:04  dayu2020  阅读(25)  评论(0)    收藏  举报