博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
chapter 5、Django restframework
阅读量:2345 次
发布时间:2019-05-10

本文共 5961 字,大约阅读时间需要 19 分钟。

 

目录

 


 

RESTframework方法详解:

RESTframework官方文档:

 

5.1分发路由

mxshop.urls.py

urlpatterns = [    path('goods/',include('goods.urls'),name = 'goods'),    # path('goods/',GoodsListView.as_view(),name = 'goods_list'),]

goods.urls.py

from django.urls import path,re_pathfrom .views_base import GoodsListViewurlpatterns = [    path('list/',GoodsListView.as_view(),name = 'list')]

5.2序列化数据(将数据库文件取出转换为json问价并传递到前端网页)

1、在浏览器中安装jsonview插件

2、goods.views_base.py

import jsonfrom django.views.generic.base import Viewfrom django.http import HttpResponse,JsonResponsefrom django.forms.models import model_to_dictfrom django.core import serializersfrom goods.models import Goodsclass GoodsListView(View):    '''    商品列表页    '''    def get(self,request):        goods = Goods.objects.all()[:10]        # json_list = []        # for good in goods:        #     json_dict = {}        #     json_dict['name'] = good.name        #     json_dict['category'] = good.category.name        #     json_dict['market_price'] = good.market_price        #     json_list.append(json_dict)        # for good in goods:        #     json_dict = model_to_dict(good)        #     json_list.append(json_dict)        # return HttpResponse(json.dumps(json_list),content_type='application/json')        json_data = serializers.serialize('json',goods)#将数据库中取出的内容转换为json        json_data = json.loads(json_data)#将json数据转换为字符数据        return JsonResponse(json_data,safe=False)

前端显示效果:

5.3serializer的使用

5.4serializer配置

1、在goods app 下面新建serializer.py文件 这个文件和models.py文件功能相类似,是建立在models.py文件基础之上的文件

serializer.py

from rest_framework import serializersclass GoodsSerialize(serializers.Serializer):    name = serializers.CharField(required=True,max_length=50)    click_num = serializers.IntegerField(default=0)

2、配置goods.views.py

from .serializer import GoodsSerializefrom rest_framework.views import APIViewfrom rest_framework.response import Responsefrom .models import Goodsclass GoodsListView(APIView):    """    List all snippets, or create a new snippet.    """    def get(self, request, format=None):        goods = Goods.objects.all()[:10]        goods_serializer = GoodsSerialize(goods, many=True)#mang = True 结果会序列化为一个数组对象        return Response(goods_serializer.data)

3、将之前配置的views_base.py中的GoodsListView路由删除,重新配置views.py中的路由

 

 

5.5 完善serializer.py

from rest_framework import serializersfrom .models import Goods,GoodsCategoryclass GoodsCategorySerialize(serializers.ModelSerializer):    class Meta:        model = GoodsCategory        fields = "__all__"#和forms.py 的功能一样,但是serializer可以不指明字段,直接写all,即使用全部字段class GoodsSerialize(serializers.ModelSerializer):#serializers.ModelSerializer不再继承serializers.Serializer了    category = GoodsCategorySerialize()#category 为goods的外键这里直接继承外键的内容,就可以将外键的内容全部显示    class Meta:        model = Goods        fields = "__all__"# class GoodsSerialize(serializers.Serializer):#     name = serializers.CharField(max_length=50,default='')#     click_num = serializers.IntegerField(default=0)

5.6 优化views.py并进行分页

 1、Django restframework serializer 重写编写goods.views.py

# from .serializer import GoodsSerialize# from rest_framework.views import APIView# from rest_framework.response import Response# from .models import Goods# class GoodsListView(APIView):#     """#     List all snippets, or create a new snippet.#     """#     def get(self, request, format=None):#         goods = Goods.objects.all()[:10]#         goods_serializer = GoodsSerialize(goods, many=True)#mang = True 结果会序列化为一个数组对象#         return Response(goods_serializer.data)    # def post(self, request, format=None):    #     serializer = GoodsSerialize(data=request.data)    #     if serializer.is_valid():    #         serializer.save()    #         return Response(serializer.data, status=status.HTTP_201_CREATED)    #     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)from rest_framework import mixinsfrom rest_framework import genericsfrom .models import Goodsfrom .serializer import GoodsSerializeclass GoodsListView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):    '''    queryset和serializer_class的名字不可以改变,因为所继承的generics.GenericAPIView源码里面的参数就是这个名字    '''    queryset = Goods.objects.all()    serializer_class = GoodsSerialize    def get(self, request, *args, **kwargs):        return self.list(request, *args, **kwargs)

通过继承的方式简化views.py的编写

2、sittings.py设置前端分页

REST_FRAMEWORK = {    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',    'PAGE_SIZE': 10,}

5.7 viewset

1、修改views.py 使用继承viewset的方式

修改前代码:

from rest_framework import mixinsfrom rest_framework import genericsfrom rest_framework import viewsetsfrom .models import Goodsfrom .serializer import GoodsSerializeclass GoodsListView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):    '''    queryset和serializer_class的名字不可以改变,因为所继承的generics.GenericAPIView源码里面的参数就是这个名字    '''    queryset = Goods.objects.all()    serializer_class = GoodsSerialize    def get(self, request, *args, **kwargs):        return self.list(request, *args, **kwargs)

修改后代码:

from rest_framework import mixinsfrom rest_framework import viewsetsfrom .models import Goodsfrom .serializer import GoodsSerializeclass GoodsListViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):    queryset = Goods.objects.all()    serializer_class = GoodsSerialize

2、在goods.urls.py中注册url

A:不使用router方式的注册:

from django.urls import path,re_path# from .views_base import GoodsListViewfrom .views import GoodsListViewSetlist = GoodsListViewSet.as_view(    {        'get':'list',    })urlpatterns = [    path('list/',list,name = 'list')]

B、使用router方式注册:

from django.urls import path,re_path,includefrom rest_framework.routers import DefaultRouterfrom .views import GoodsListViewSetrouter = DefaultRouter()router.register(r'list',GoodsListViewSet,base_name='list')urlpatterns = [    path('',include(router.urls))]

5.8 RESTframework 的继承关系

5.9 Django request和response类

5.10过滤,懒得写爬源码吧

 

 

 

 

 

你可能感兴趣的文章
mysql字符集乱码问题
查看>>
python读写文件file写入到mysql
查看>>
saltstack 数据系统——Grains和pillar
查看>>
postgresql - 三种安装方式
查看>>
Web服务器之Nginx详解(理论部分)
查看>>
Web服务器之Nginx详解(操作部分)
查看>>
CentOS6.4+Nginx1.4.2+MySQL5.6.13+PHP5.5.3+xCache3.03(最新LNMP编译安装过程)
查看>>
Linux下的qperf测量网络带宽和延迟和iptraf网卡流量监控
查看>>
Linux下的MySQL主主复制和Mysql-MMM实现(Mysql双主多从高可用)
查看>>
drbd安装及配置
查看>>
tomcat安装、配置、优化及负载均衡简介
查看>>
python 产生随机数,随机字符串
查看>>
python排序函数sort()与sorted()区别
查看>>
Python核心模块——urllib模块
查看>>
linux的time命令
查看>>
测试磁盘读写性能
查看>>
mtr命令详解诊断网络路由
查看>>
用ethtool 命令解决Linux 网卡丢包
查看>>
pm2常用的命令用法介绍
查看>>
MongoDB设置 Replication Sets
查看>>