笔记: Django Rest Framework 路由router

1, 先写一个APP, 名字叫dsj

1.1 urls.py文件内容如下:

from django.urls import path, re_path, include
from django.conf.urls import url
from . import views

#下面是用rest framework的路由系统是设置
from rest_framework import routers
router = routers.DefaultRouter() #实例化一个默认的类
router.register(prefix=r'xxx', viewset=views.V3View) #注册到系统中去,注意这里的参数,prefix是前缀的意思,生成的url中会有这个,viewset就是想要对哪个视图进行注册,这里是V3View
router.register(prefix=r'rt', viewset=views.V3View) #这里不会错,因为前缀不同,生成的url是不同的.注册到系统中去,注意这里的参数,prefix是前缀的意思,生成的url中会有这个,viewset就是想要对哪个视图进行注册,这里是V3View
#如何验证上面的路由设置,以及下面的设置,只要我们在url中写错,那么就会报错出来好多路由,就可以看到是不是有自动生成的路由url


urlpatterns = [
    re_path(r'^roles/$', views.RolesView.as_view()),
    re_path(r'^userinfo/$', views.UserInfoView.as_view()),
    re_path(r'^group/(?P\d+)$', views.GroupView.as_view(), name='gp'), #注意这里的pk,默认系统里面这么写的,可以在view中改掉.,源码在: class HyperlinkedRelatedField(RelatedField): lookup_field = 'pk' 这个pk就是人家默认规定的就是这个pk,但是pk不对,因为pk是id,id是变化的,二分组是固定的.
    re_path(r'^usergroup/$', views.UserGroupView.as_view()),
    re_path(r'^page1/$', views.Page1View.as_view()), #这个是测试分页的功能的时候的URL
    re_path(r'^page2/$', views.Page1View_2.as_view()), #这个是测试分页的功能的时候的URL
    re_path(r'^page3/$', views.Page1View_3.as_view()), #这个是测试分页的功能的时候的URL
    re_path(r'^v1/$', views.V1View.as_view()), #这个是测试restframework View视图功能的时候的URL
    re_path(r'^v2/$', views.V2View.as_view({'get': 'xxx'})), #这里V2View()继承了GenericViewSet,这个类重写了as_view()方法,需要传递action方法

    #这里V3View()继承了ModelViewSet, ModelViewSet又继承了GenericViewSet(),然后GenericViewSet重写了as_view()方法,所以我们自定义的类视图继承了ModelViewSet()类
    #也要改写url中的as_view(),给他传递参数.
    # 首先这个一一对应就需要查询源码了,源码里面有具体的函数名字.
    re_path(r'^v3/$', views.V3View.as_view({'get': 'list', 'post':'create'})), # 注意这个url的前半部分,没有写那个pk,什么意思,表示get请求的是全部的数据,post请求不需要指定的pk,直接就可以朝数据库中传递对应的字段,
    # 注意下面的url,这个里面的pk\d+表示针对的是数据库中的一个数据,不再是整体了,对一个数据操作,看一下各自对应的方法.记得不要写错.就可以实现一一对应增删改查的功能
    re_path(r'^v3/(?P\d+)/$', views.V3View.as_view({'get': 'retrieve', 'delete':'destroy', 'put':'update', 'patch':'partial_update'})),


    #'''
    #下面的代码是路由系统,自动生成的路由
    #为什么需要系统自动生成url,因为针对一个视图,一般会有2个url,因为是获取的整体和单独的一个数据的原因,那么再加上json格式的缘故,就会有一个
    #视图生成了4个url,那么如果觉得自己写的很麻烦,可以在这里设置一些,让系统自己帮你生成
    #'''
    # url(r'(?P)[v1|v2]/$', include(router.urls)),带有版本前缀的写法.
    url(r'^', include(router.urls)), #这里一定要用url(),re_path 和path 不行.



    #下面的url是用来测试渲染器的
    url(r'^test/$', views.TestView.as_view())

]

1.2 models.py 文件内容如下,新建数据表

from django.db import models

class UserInfo(models.Model):
    user_type_choices = (
        (1, '普通用户'),
        (2, 'VIP客户'),
        (3, 'SVIP')
    )
    user_type = models.IntegerField(choices=user_type_choices)

    username = models.CharField(max_length=32, unique=True)
    password = models.CharField(max_length=64)

    group = models.ForeignKey(to='UserGroup', on_delete=models.CASCADE) # 假设一个组对应多个人,一个人只有多个组
    roles = models.ManyToManyField('Role')

class UserGroup(models.Model):
    title = models.CharField(max_length=32)

class Role(models.Model):
    title = models.CharField(max_length=32)

1.3 views.py 文件编写, 写serializer 序列化和反序列化

####################################路由系统开始##############################################################


'''
路由系统主要是在urls.py中完成的,这里没有代码,在哪里设置了之后可以自动生成url
转战到urls.py文件察看.
'''
##############路由系统结束####################

你可能感兴趣的:(django)