• 🍖drf 路由组件


    一.路由介绍 (Routers)

    1.router 的作用

    对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息

    2.REST framework 提供的两个 route

    • SimpleRouter (简单的路由) (两条)
    • DefaultRouter (默认的路由) (六条)

    二.使用方法

    1.使用步骤

    • 前提 : 必须是继承了 ViewSetMixin 类的视图+9种视图子类才可以使用路由组件快速生成路由
    • 导入路由类 : from rest_framework.routers import SimpleRouter,DefaultRouter
    • 实例化得到对象 : router = SimpleRouter()
    • 注册路由 : router.register('book2',views.BookView)
    • 把自动生成的路由加到 urlpatterns 中去 : urlpatterns += router.urls

    2.参数介绍及注意点

    • register方法参数
    # 查看其源码
    def register(self, prefix, viewset, basename=None):
    	...
    # prefix : 路由前缀
    # viewset : 视图集
    # basename : 路由别名
    
    • prefix 参数不需要加前缀
    router.register('book2',views.BookView)  # book2 不需要加前缀
    

    3.代码示例

    • models.py
    from django.contrib.auth.models import AbstractUser
    
    class base(models.Model):
        name = models.CharField(max_length=16)
        price = models.IntegerField()
        class Mate:
            abstract = True  # 声明这张表是张抽象表,不会在数据库中进行创建,只用来给别的模型类继承
    
    class Book2(base):  # 继承了base,就会有base中的字段
        nid = models.AutoField(primary_key=True)
        author = models.CharField(max_length=16, null=True)
        publish = models.CharField(max_length=16, null=True)
    

    abstract 一般用于多个模型类中存在相同的字段, 为了避免重复书写相同的字段, 可以使用 abstract 指定一张抽象表用作继承

    • serializers.py
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Book2
            fields = "__all__"
    
    • views.py
    from rest_framework.viewsets import ModelViewSet
    from mydrf.serializers import BookSerializer
    
    class BookView(ModelViewSet):
        queryset = models.Book2.objects.all()
        serializer_class = BookSerializer
    
    • urls.py
    # 1.导入路由类
    from rest_framework.routers import SimpleRouter,DefaultRouter
    # 2.实例化得到对象
    router = SimpleRouter()
    # 3.注册路由
    router.register('book2',views.BookView)
    print(router.urls)  # 自动生成的路由
    '''
    [<URLPattern '^book2/$' [name='book2-list']>, <URLPattern '^book2/(?P<pk>[^/.]+)/$' [name='book2-detail']>]
    '''
    	
    urlpatterns = []
    
    # 4.把自动生成的路由加到 urlpatterns 中去(实际上就是两个列表相加)
    urlpatterns += router.urls
    
    • 查看 SimpleRouter 自动生成的路由(两条)

    image-20210415213713208

    • 查看 SimpleRouter 自动生成的路由(六条)(有根,可以通过根访问)

    image-20210415213847891

    三.添加路由的另一种方式

    • urls.py 文件
    # 需要导入 include
    from django.urls import path,include
    
    urlpatterns = [    
        path(r'',include(router.urls))
    ]
    
    # 或者添加前缀
    urlpatterns = [    
        path(r'app1/',include(router.urls))
    ]
    

    image-20210415215744053

    四. action 装饰器的使用

    1.作用

    • 为我们在视图集中自定义的方法生成路由
    class BookView(ModelViewSet):
        queryset = models.Book2.objects.all()
        serializer_class = BookSerializer
    
        # 自定义的方法不会自动生成路由, 需要添加 action 装饰器
        def index(self, request):
            return Response('ok!')
    
        # 不会自动生成路由
        def top5(self, request):
            return Response('get_5_ok!')
    

    2.action 的参数说明

    • method : 声明该 action 对应的请求方式, 使用列表传递
    # 查看其源码 :
        methods = ['get'] if (methods is None) else methods
        methods = [method.lower() for method in methods]
    
    # 第一条如果没有指定该参数,默认是 "get" 方法
    # 第二条表示方法可以大小写,它都会将其转换成小写
    
    • detail : 声明该 action 的路径是否与单一资源对应,布尔值
    # True : 表示不是单一资源路径(可以用来匹配一条数据) : 
        例:127.0.0.1:8000/<pk>/[action方法名]/
    # False : 表示单一的资源路径(可以匹配多条数据) : 
        例:127.0.0.1:8000/[action方法名]/
    

    3.action 装饰器的使用

    # 先导入 action
    from rest_framework.decorators import action
    
    class BookView(ModelViewSet):
        queryset = models.Book2.objects.all()
        serializer_class = BookSerializer
    
        @action(methods=['get'],detail=False)
        def index(self, request):
            return Response('ok!')
    
        @action(methods=['post'],detail=True)
        def top5(self, request):
            return Response('get_5_ok!')
    

    image-20210415222606955

  • 相关阅读:
    P1629 邮递员送信
    P1119 灾后重建
    最短路问题
    P1194 买礼物
    最小生成树
    P1038 神经网络
    P2661 信息传递
    mysql 5.7启动报错
    docker flannel网络部署和路由走向分析
    k8s---无头服务
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14670493.html
Copyright © 2020-2023  润新知