笔记: Django Rest Framework 渲染器

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<pk>\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<pk>\d+)/$', views.V3View.as_view({'get': 'retrieve', 'delete':'destroy', 'put':'update', 'patch':'partial_update'})),


    #'''
    #下面的代码是路由系统,自动生成的路由
    #为什么需要系统自动生成url,因为针对一个视图,一般会有2个url,因为是获取的整体和单独的一个数据的原因,那么再加上json格式的缘故,就会有一个
    #视图生成了4个url,那么如果觉得自己写的很麻烦,可以在这里设置一些,让系统自己帮你生成
    #'''
    # url(r'(?P<version>)[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 文件编写

########################渲染器开始########################
#还是哪role数据表来操作,先分页,后序列化
class Role_Render_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Role
        fields = '__all__'
# 方法1: 用values然后用list类型把获取出来的Queryset类型的某一列,或者几列,转换成list类型,然后用json,就可以输出.

from rest_framework.renderers import JSONRenderer, AdminRenderer, HTMLFormRenderer

class TestView(APIView):

    # 渲染器可以写到这里,也可以写到setting.py 文件里面
    renderer_classes = [JSONRenderer, AdminRenderer, HTMLFormRenderer] # 这里添加渲染器的类,这个跟之前的那个权限和Auth一样,都是把类,放到列表里面,然后让系统自己实例化.

    def get(self, request, *args, **kwargs):
        #取出所有的role
        roles = Role.objects.all()
        #设置分页参数
        pg = PageNumberPagination()
        pg.page_size = 2
        pg.max_page_size = 10
        pg_ret = pg.paginate_queryset(queryset=roles, request=request, view=self)

        #序列化数据
        ser = Role_Render_Serializer(instance=pg_ret, many=True)

        return Response(ser.data)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值