ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-04-17 13:35:56  阅读:131  来源: 互联网

标签:models 视图 action urls 组件 router class 路由 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

标签:models,视图,action,urls,组件,router,class,路由,drf
来源: https://www.cnblogs.com/songhaixing/p/14670493.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有