Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(3)
1.drf前期准备
1.django-rest-framework官方文档
https://www.django-rest-framework.org/
#直接百度找到的djangorestframework的官网是打不开的
2.安装依赖包

如图所示,django restframework的依赖模块,除了coreapi和django-guardian,已经在前面安装过了。
打开终端,执行安装命令
pip install django-guardian
pip install coreapi
3.将rest_framework在settings中注册

4.管理调试api的时候会用到的url配置,在urls.py中
from django.urls import path from django.views.static import serve
from MxShop.settings import MEDIA_ROOT
from django.urls import include import xadmin from rest_framework.documentation import include_docs_urls from goods.views import GoodsListView urlpatterns = [
path('xadmin/', xadmin.site.urls),
path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
path('ueditor/',include('DjangoUeditor.urls' )),
path('docs/',include_docs_urls(title="慕学生鲜")),
path('api-auth/', include('rest_framework.urls')),
path('goods/',GoodsListView.as_view(),name='goods-list'),
]
2.序列化商品数据
在goods目录下新建serializers.py文件
from rest_framework import serializers
from goods.models import Goods,GoodsCategory class GoodsSerializer(serializers.Serializer):#Serializer方式序列化
name=serializers.CharField(required=True,max_length=100)
click_num=serializers.IntegerField(default=0)
goods_front_image=serializers.ImageField() # 用于post
def create(self, validated_data):
return Goods.objects.create(**validated_data) class CategoryModelSerializer(serializers.ModelSerializer):
class Meta:
model=GoodsCategory
fields="__all__"#将整个表的所有字段都序列化 class GoodsModelSerializer(serializers.ModelSerializer):#ModelSerializer方式序列化
category=CategoryModelSerializer()#外键信息嵌入
class Meta:
model=Goods
# fields="__all__"#将整个表的所有字段都序列化
fields=('name','goods_front_image','category')#指定序列化某些字段
3.视图封装
1.使用APIView+Response实现商品列表页视图(最想原生django的CBV写法)
views.py中
from .serializers import GoodsSerializer,GoodsModelSerializer
from rest_framework.views import APIView
from rest_framework.response import Response from .models import Goods
from rest_framework import status class GoodsListView1(APIView):
"""
List all goods,使用Serializer
"""
def get(self, request, format=None):
goods=Goods.objects.all()[:10]
goods_serializer = GoodsSerializer(goods, many=True)
return Response(goods_serializer.data) def post(self,request,format=None):
serializer=GoodsSerializer(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) class GoodsListView2(APIView):
"""
List all goods,使用ModelSerializer
"""
def get(self, request, format=None):
goods=Goods.objects.all()[:10]
goods_serializer = GoodsModelSerializer(goods, many=True)
return Response(goods_serializer.data)
urls.py中
from django.contrib import admin
from django.urls import path from django.views.static import serve
from MxShop.settings import MEDIA_ROOT import xadmin
from goods.views import GoodsListView1,GoodsListView2 urlpatterns = [
path('admin/', admin.site.urls),
path('xadmin/', xadmin.site.urls),
path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}),
path('ueditor/',include('DjangoUeditor.urls' )), path('goods/',GoodsListView1.as_view(),name='goods-list'),
path('goods2/',GoodsListView2.as_view(),name='goods-list2')
]
2.使用mixins+generic实现商品列表页视图
from .serializers import GoodsSerializer
from .models import Goods
from rest_framework import mixins
from rest_framework import generics class GoodsListView(mixins.ListModelMixin,generics.GenericAPIView):
"""
商品列表页
"""
queryset = Goods.objects.get_queryset().order_by('id')[:10]
serializer_class = GoodsSerializer def get(self,request,*args,**kwargs): return self.list(request,*args,**kwargs)
3.使用generics.ListAPIView实现商品列表页视图
from .serializers import GoodsSerializer
from .models import Goods
from rest_framework import generics class GoodsListView(generics.ListAPIView):
"""
商品列表页
"""
queryset = Goods.objects.get_queryset().order_by('id')
serializer_class = GoodsSerializer
4.分页
1.全局分页:在settings中加入代码,所有的列表页,都会变成每10个一页的分页方式,显然这有很大的局限性
REST_FRAMEWORK={
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
}
2.局部定制化分页:在view中定义代码
from rest_framework.pagination import PageNumberPagination class GoodsPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
page_query_param = 'p'
max_page_size = 100 class GoodsListView(generics.ListAPIView):
"""
商品列表页
"""
queryset = Goods.objects.get_queryset().order_by('id')
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
5.viewsets
1.在views中
from rest_framework import viewsets class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
"""
商品列表页
"""
queryset = Goods.objects.get_queryset().order_by('id')
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
2.在urls中
from goods.views import GoodsListViewSet from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'goods', GoodsListViewSet,base_name="goods")
urlpatterns = [ path('', include(router.urls)) ]
Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(3)的更多相关文章
- Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(2)
1.restful api介绍 1.前后端分离的优缺点 1.为什么要用前后端分离 1.pc.app.pad多端适应 2.SPA(单页面应用)开发模式开始流行 3.前后端分离职责不清 4.开发效率问题, ...
- Vue+Django2.0 restframework打造前后端分离的生鲜电商项目(1)
1.开发环境配置 Windows7 64位旗舰版 python3.6 node.js mysql navicat pycharm webstorm或vscode 2.项目初始化 新版的pycharm很 ...
- 前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)
开门见山,本文分享前后端分离,容器化前端项目时动态插入后端API基地址,这是一个很赞的实践,解决了前端项目容器化过程中受制后端调用的尴尬. 尴尬从何而来 常见的web前后端分离:前后端分开部署,前端项 ...
- 引爆潮流技术 Vue+Django REST framework打造生鲜电商项目
引爆潮流技术Vue+Django REST framework打造生鲜电商项目 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受, ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝
web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍
web前端Vue+Django rest framework 框架 生鲜电商项目实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...
- nodeJS(express4.x)+vue(vue-cli)构建前后端分离详细教程(带跨域)
好想再回到大学宿舍,当时床虽小,房随小,但是心确是满的 ----致 西安工程大学a-114舍友们 转载请注明出处:水车:http://www.cnblogs.com/xuange306/p/6185 ...
- vue + spring boot + spring security 前后端分离 携带 Cookie 登录实现 只写了个登录
最近想弄一下vue 所以就自己给自己找坑入 结果弄的满身是伤 哈哈哈 首先我说下 前后端分离 跨域请求 我在网上找了一些 可是都是针对于 spring boot 的 我自己还有 securi ...
- Yii框架和Vue的完美结合完成前后端分离项目
背景说明 本文假设你对Yii和Vue都比较熟悉,至少都在项目里用过,另外笔者新人,以后不定时放一些干货,欢迎程序媛关注 Yii是一个PHP全端框架,典型的mvc的项目结构,后端接口都是一个控制器里放了 ...
随机推荐
- hive数学函数
round 四舍五入 ceil向上 取整 floor向下取整 hive > select floor(45.8); ok 45
- css繼承
概念:就是上級設置了css屬性,下級默認有同樣的樣式,如果下級需要不一樣的樣式,那麼就需要單獨對下級設置. 範圍: font-family:字體 font-weight:粗細 font-size:尺寸 ...
- Lodop打印控件 超文本自动分页
Lodop打印控件打印html超文本,通常传入一个超文本内容可能会超过纸张,如果要拆分每页显示哪些然后手动分页比较麻烦,Lodop中的超文本都有自动分页的特点.自动分页的依据:1.超文本超过设置的打印 ...
- 学习 Spring (六) 自动装配
Spring入门篇 学习笔记 No: (默认)不做任何操作 byName: 根据属性名自动装配.此选项将检查容器并根据名字查找与属性完全一致的 bean,并将其与属性自动装配 byType: 如果容器 ...
- git bash 下操作文件及文件夹命令
1, cd : change directory的简写,改变目录的意思,就是切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通 ...
- kubernetes 简单yaml文件运行例子deployment
运行一个deployment: kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2 基本例子: nginx-test.y ...
- CDQ题目套路总结 [未完成]
CDQ学习资料 day1cdq分治相关 CDQ的IOI论文 1.优化斜率dp 左边对右边影响维护一个凸包解决 需要知识:①凸包②斜率dp 题目:√ HDU3842 Machine Works HY ...
- LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】
题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...
- Linux大学实验
一. 准备工作(预防抄袭,此步必做) 1. 请将提示符设为:学号加波浪号.输入PS1=学号~,如PS1=110015~, 回车执行 2. 如发现提示符.学号不匹配, 视为抄袭或无效 二.操作题(每题5 ...
- [洛谷P1272] 重建道路
类型:树形背包 传送门:>Here< 题意:给出一棵树,要求断开$k$条边来分离出一棵有$P$个节点的子树.求最小的$k$ 解题思路 和上一题类型相同,但不那么好做了——分离出的一棵子树肯 ...