目录

生鲜超市(一)    生鲜超市(二)    生鲜超市(三)

生鲜超市(四)    生鲜超市(五)    生鲜超市(六)

生鲜超市(七)    生鲜超市(八)    生鲜超市(九)

生鲜超市(十)    生鲜超市(十一)    生鲜超市(十二)    生鲜超市(十三)

代码下载

github

教程

学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市

十、购物车、订单管理和支付功能

10.1.添加商品到购物车

(1)trade/serializer.py

  1. # trade/serializer.py
  2. __author__ = 'derek'
  3.  
  4. from .models import ShoppingCart
  5. from rest_framework import serializers
  6. from goods.models import Goods
  7.  
  8. class ShopCartSerializer(serializers.Serializer):
  9. #获取当前登录的用户
  10. user = serializers.HiddenField(
  11. default=serializers.CurrentUserDefault()
  12. )
  13. nums = serializers.IntegerField(required=True, label="数量",min_value=1,
  14. error_messages={
  15. "min_value":"商品数量不能小于一",
  16. "required": "请选择购买数量"
  17. })
  18. #这里是继承Serializer,必须指定queryset对象,如果继承ModelSerializer则不需要指定
  19. #goods是一个外键,可以通过这方法获取goods object中所有的值
  20. goods = serializers.PrimaryKeyRelatedField(required=True, queryset=Goods.objects.all())
  21.  
  22. #继承的Serializer没有save功能,必须写一个create方法
  23. def create(self, validated_data):
  24. # validated_data是已经处理过的数据
  25. #获取当前用户
  26. # view中:self.request.user;serizlizer中:self.context["request"].user
  27. user = self.context["request"].user
  28. nums = validated_data["nums"]
  29. goods = validated_data["goods"]
  30.  
  31. existed = ShoppingCart.objects.filter(user=user, goods=goods)
  32. #如果购物车中有记录,数量+1
  33. #如果购物车车没有记录,就创建
  34. if existed:
  35. existed = existed[0]
  36. existed.nums += nums
  37. existed.save()
  38. else:
  39. #添加到购物车
  40. existed = ShoppingCart.objects.create(**validated_data)
  41.  
  42. return existed

(2)trade/views.py

  1. # trade/views.py
  2.  
  3. from rest_framework import viewsets
  4. from rest_framework.permissions import IsAuthenticated
  5. from utils.permissions import IsOwnerOrReadOnly
  6. from rest_framework_jwt.authentication import JSONWebTokenAuthentication
  7. from rest_framework.authentication import SessionAuthentication
  8. from .serializers import ShopCartSerializer
  9. from .models import ShoppingCart
  10.  
  11. class ShoppingCartViewset(viewsets.ModelViewSet):
  12. """
  13. 购物车功能
  14. list:
  15. 获取购物车详情
  16. create:
  17. 加入购物车
  18. delete:
  19. 删除购物记录
  20. """
  21. permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
  22. authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
  23.  
  24. serializer_class = ShopCartSerializer
  25.  
  26. def get_queryset(self):
  27. return ShoppingCart.objects.filter(user=self.request.user

(3)配置url

  1. # 配置购物车的url
  2. router.register(r'shopcarts', ShoppingCartViewset, base_name="shopcarts")

10.1.添加购物车数量

Serializer继承BaseSerializer,但是Seriazer中并没有重新update方法,所有添加一个update方法

trade/serializer.py

  1. def update(self, instance, validated_data):
  2. # 修改商品数量
  3. instance.nums = validated_data["nums"]
  4. instance.save()
  5. return instance

在view中要把商品id传过去

  1. lookup_field = "goods_id"

10.3.vue和购物车接口联调

购物车中可以看商品详情,需要写一个商品详情的serializer,所有在view中需要动态设置serializer

(1)trade/serializer.py

  1. class ShopCartDetailSerializer(serializers.ModelSerializer):
  2. '''
  3. 购物车商品详情信息
  4. '''
  5. # 一个购物车对应一个商品
  6. goods = GoodsSerializer(many=False, read_only=True)
  7. class Meta:
  8. model = ShoppingCart
  9. fields = ("goods", "nums")

(2)trade/views.py

需要动态选择serializer

  1. def get_serializer_class(self):
  2. if self.action == 'list':
  3. return ShopCartDetailSerializer
  4. else:
  5. return ShopCartSerializer

10.4.订单管理接口

(1)trade/serializer.py

用户添加商品到购物车,点去购物车结算,填上地址留言,结算生成订单,在会员中心我的订单里面,可以看到订单列表,点订单可以看到订单的详细信息。

  1. #订单中的商品
  2. class OrderGoodsSerialzier(serializers.ModelSerializer):
  3. goods = GoodsSerializer(many=False)
  4. class Meta:
  5. model = OrderGoods
  6. fields = "__all__"
  7.  
  8. #订单商品信息
  9. # goods字段需要嵌套一个OrderGoodsSerializer
  10. class OrderDetailSerializer(serializers.ModelSerializer):
  11. goods = OrderGoodsSerialzier(many=True)
  12. class Meta:
  13. model = OrderInfo
  14. fields = "__all__"
  15.  
  16. class OrderSerializer(serializers.ModelSerializer):
  17. user = serializers.HiddenField(
  18. default=serializers.CurrentUserDefault()
  19. )
  20. #生成订单的时候这些不用post
  21. pay_status = serializers.CharField(read_only=True)
  22. trade_no = serializers.CharField(read_only=True)
  23. order_sn = serializers.CharField(read_only=True)
  24. pay_time = serializers.DateTimeField(read_only=True)
  25. nonce_str = serializers.CharField(read_only=True)
  26. pay_type = serializers.CharField(read_only=True)
  27.  
  28. def generate_order_sn(self):
  29. #生成订单号
  30. # 当前时间+userid+随机数
  31. from random import Random
  32. random_ins = Random()
  33. order_sn = "{time_str}{userid}{ranstr}".format(time_str=time.strftime("%Y%m%d%H%M%S"),
  34. userid=self.context["request"].user.id,
  35. ranstr=random_ins.randint(10, 99))
  36. return order_sn
  37.  
  38. def validate(self, attrs):
  39. #validate中添加order_sn,然后在view中就可以save
  40. attrs["order_sn"] = self.generate_order_sn()
  41. return attrs
  42.  
  43. class Meta:
  44. model = OrderInfo
  45. fields = "__all__"

(2)trade/views.py

  1. class OrderViewset(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin,
  2. viewsets.GenericViewSet):
  3. """
  4. 订单管理
  5. list:
  6. 获取个人订单
  7. delete:
  8. 删除订单
  9. create:
  10. 新增订单
  11. """
  12. permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
  13. authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
  14. serializer_class = OrderSerializer
  15. #动态配置serializer
  16. def get_serializer_class(self):
  17. if self.action == "retrieve":
  18. return OrderDetailSerializer
  19. return OrderSerializer
  20. #获取订单列表
  21. def get_queryset(self):
  22. return OrderInfo.objects.filter(user=self.request.user)
  23.  
  24. #在订单提交保存之前还需要多两步步骤,所以这里自定义perform_create方法
  25. #1.将购物车中的商品保存到OrderGoods中
  26. #2.清空购物车
  27. def perform_create(self, serializer):
  28. order = serializer.save()
  29. # 获取购物车所有商品
  30. shop_carts = ShoppingCart.objects.filter(user=self.request.user)
  31. for shop_cart in shop_carts:
  32. order_goods = OrderGoods()
  33. order_goods.goods = shop_cart.goods
  34. order_goods.goods_num = shop_cart.nums
  35. order_goods.order = order
  36. order_goods.save()
  37. #清空购物车
  38. shop_cart.delete()
  39. return order

(3)配置url

  1. # 配置订单的url
  2. router.register(r'orders', OrderViewset, base_name="orders")

Django REST framework+Vue 打造生鲜超市(九)的更多相关文章

  1. Django REST framework+Vue 打造生鲜超市(三)

    四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py ...

  2. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  3. Django REST framework+Vue 打造生鲜超市(五)

    六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...

  4. Django REST framework+Vue 打造生鲜超市(十二)

    十三.首页.商品数量.缓存和限速功能开发  13.1.轮播图接口实现 首先把pycharm环境改成本地的,vue中local_host也改成本地 (1)goods/serializer class B ...

  5. Django REST framework+Vue 打造生鲜超市(八)

    九.个人中心功能开发 9.1.drf的api文档自动生成和 (1) url #drf文档,title自定义 path('docs',include_docs_urls(title='仙剑奇侠传')), ...

  6. Django REST framework+Vue 打造生鲜超市(一)

    一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...

  7. Django REST framework+Vue 打造生鲜超市(二)

    三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow  图片处理 pip in ...

  8. Django REST framework+Vue 打造生鲜超市(六)

    七.用户登录与手机注册 7.1.drf的token (1)INSTALL_APP中添加 INSTALLED_APPS = ( ... 'rest_framework.authtoken' ) toke ...

  9. Django REST framework+Vue 打造生鲜超市(十)

    十一.pycharm远程代码调试 第三方登录和支付,都需要有服务器才行(回调url),我们可以用pycharm去远程调试服务器代码 服务器环境搭建 以全新阿里云centos7系统为例: 11.1.阿里 ...

随机推荐

  1. V-bind详细使用

    v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url">& ...

  2. 【Python】 获取MP3信息replica

    replica 初衷是想要整理iphone中的音乐.IOS(我自己的手机还是IOS8.3,新版本的系统可能有变化了)自带的音乐软件中所有音乐文件都存放在/var/mobile/Media/iTunes ...

  3. 【Python】 sys和os模块

    sys sys模块能使程序访问于python解释器联系紧密的变量和函数 ● sys中的一些函数和变量 argv 命令行参数构成的列表 path 查找所有可用模块所在的目录名的列表 platform 查 ...

  4. Nginx正向代理与反向代理

    1.正向代理: 正向代理类似一个跳板机,代理访问外部资源. 典型应用:为在防火墙内的局域网客户端提供访问Internet的途径    如:IE例外设置代理服务器 正向代理配置实例:为不影响默认配置:添 ...

  5. 实现Windows程序的数据的绑定

    1.创建DataSet对象 语法: DataSet  数据集对象  =new  DataSet("数据集的名称字符串"); 语法中的参数是数据集的名称字符串,可以有,也可以没有.如 ...

  6. oracle管理权限和角色

    介绍 这一部分主要看看oracle中如何管理权限和角色,权限和角色的区别在哪里. 当刚刚建立用户时,用户没有任何权限,也不能执行任何操作.如果要执行某种特定的数据库操作,则必需为其授予系统的权限:如果 ...

  7. [Scala] 实现 NDCG

    一.关于 NDCG [LTR] 信息检索评价指标(RP/MAP/DCG/NDCG/RR/ERR) 二.代码实现 1.训练数据的加载解析 import scala.io.Source /* * 训练行数 ...

  8. UserControl 用户定义组件

    <pages> <namespaces> <add namespace="System.Web.Optimization" /> </na ...

  9. 项目Alpha冲刺Day2

    一.会议照片 二.项目进展 1.今日安排 初步搭建后台框架,根据昨天的最终设计再修改原型,成功使用powerDesigner导出sql. 2.问题困难 使用了比较多的框架,而且是首次尝试纯java配置 ...

  10. Flask 扩展 Flask-RESTful

    Flask路由可以指定HTTP请求方法,并在请求函数中根据不同的请求方法,执行不同的逻辑.这样实现一个Restful的请求已经相当简单了 Flask还有更简便的方法,就是其Flask-RESTful扩 ...