目录

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

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

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

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

代码下载

github

教程

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

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

10.1.添加商品到购物车

(1)trade/serializer.py

# trade/serializer.py
__author__ = 'derek'from .models import ShoppingCart
from rest_framework import serializers
from goods.models import Goodsclass ShopCartSerializer(serializers.Serializer):#获取当前登录的用户user = serializers.HiddenField(default=serializers.CurrentUserDefault())nums = serializers.IntegerField(required=True, label="数量",min_value=1,error_messages={"min_value":"商品数量不能小于一","required": "请选择购买数量"})#这里是继承Serializer,必须指定queryset对象,如果继承ModelSerializer则不需要指定#goods是一个外键,可以通过这方法获取goods object中所有的值goods = serializers.PrimaryKeyRelatedField(required=True, queryset=Goods.objects.all())#继承的Serializer没有save功能,必须写一个create方法def create(self, validated_data):# validated_data是已经处理过的数据#获取当前用户# view中:self.request.user;serizlizer中:self.context["request"].useruser = self.context["request"].usernums = validated_data["nums"]goods = validated_data["goods"]existed = ShoppingCart.objects.filter(user=user, goods=goods)#如果购物车中有记录,数量+1#如果购物车车没有记录,就创建if existed:existed = existed[0]existed.nums += numsexisted.save()else:#添加到购物车existed = ShoppingCart.objects.create(**validated_data)return existed

(2)trade/views.py

# trade/views.pyfrom rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from utils.permissions import IsOwnerOrReadOnly
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.authentication import SessionAuthentication
from .serializers import ShopCartSerializer
from .models import ShoppingCartclass ShoppingCartViewset(viewsets.ModelViewSet):"""购物车功能list:获取购物车详情create:加入购物车delete:删除购物记录"""permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)serializer_class = ShopCartSerializerdef get_queryset(self):return ShoppingCart.objects.filter(user=self.request.user

(3)配置url

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

10.1.添加购物车数量

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

trade/serializer.py

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

在view中要把商品id传过去

 lookup_field = "goods_id"

10.3.vue和购物车接口联调

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

(1)trade/serializer.py

class ShopCartDetailSerializer(serializers.ModelSerializer):'''购物车商品详情信息'''# 一个购物车对应一个商品goods = GoodsSerializer(many=False, read_only=True)class Meta:model = ShoppingCartfields = ("goods", "nums")

(2)trade/views.py

需要动态选择serializer

    def get_serializer_class(self):if self.action == 'list':return ShopCartDetailSerializerelse:return ShopCartSerializer

10.4.订单管理接口

(1)trade/serializer.py

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

#订单中的商品
class OrderGoodsSerialzier(serializers.ModelSerializer):goods = GoodsSerializer(many=False)class Meta:model = OrderGoodsfields = "__all__"#订单商品信息
# goods字段需要嵌套一个OrderGoodsSerializer
class OrderDetailSerializer(serializers.ModelSerializer):goods = OrderGoodsSerialzier(many=True)class Meta:model = OrderInfofields = "__all__"class OrderSerializer(serializers.ModelSerializer):user = serializers.HiddenField(default=serializers.CurrentUserDefault())#生成订单的时候这些不用postpay_status = serializers.CharField(read_only=True)trade_no = serializers.CharField(read_only=True)order_sn = serializers.CharField(read_only=True)pay_time = serializers.DateTimeField(read_only=True)nonce_str = serializers.CharField(read_only=True)pay_type = serializers.CharField(read_only=True)def generate_order_sn(self):#生成订单号# 当前时间+userid+随机数from random import Randomrandom_ins = Random()order_sn = "{time_str}{userid}{ranstr}".format(time_str=time.strftime("%Y%m%d%H%M%S"),userid=self.context["request"].user.id,ranstr=random_ins.randint(10, 99))return order_sndef validate(self, attrs):#validate中添加order_sn,然后在view中就可以saveattrs["order_sn"] = self.generate_order_sn()return attrsclass Meta:model = OrderInfofields = "__all__"

(2)trade/views.py

class OrderViewset(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin,viewsets.GenericViewSet):"""订单管理list:获取个人订单delete:删除订单create:新增订单"""permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)serializer_class = OrderSerializer#动态配置serializerdef get_serializer_class(self):if self.action == "retrieve":return OrderDetailSerializerreturn OrderSerializer#获取订单列表def get_queryset(self):return OrderInfo.objects.filter(user=self.request.user)#在订单提交保存之前还需要多两步步骤,所以这里自定义perform_create方法#1.将购物车中的商品保存到OrderGoods中#2.清空购物车def perform_create(self, serializer):order = serializer.save()# 获取购物车所有商品shop_carts = ShoppingCart.objects.filter(user=self.request.user)for shop_cart in shop_carts:order_goods = OrderGoods()order_goods.goods = shop_cart.goodsorder_goods.goods_num = shop_cart.numsorder_goods.order = orderorder_goods.save()#清空购物车
            shop_cart.delete()return order

(3)配置url

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

转载于:https://www.cnblogs.com/derek1184405959/p/8846501.html

Django REST framework+Vue 打造生鲜超市(九)相关推荐

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

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

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

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

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

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

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

    代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugi ...

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

    代码下载 github 教程 学习自慕课网-前端vue结合后端DjangoFramework的在线生鲜超市 三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 d ...

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

    目录 生鲜超市(一)    生鲜超市(二)    生鲜超市(三) 生鲜超市(四)    生鲜超市(五)    生鲜超市(六) 生鲜超市(七)    生鲜超市(八)    生鲜超市(九) 生鲜超市(十) ...

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

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

  8. Django进阶 Django REST framework+Vue 打造生鲜超市第一天 搭建环境

    新人学习django 是按照这个大佬的教程学习的 链接: https://www.cnblogs.com/derek1184405959/p/8733194.html. 很多步骤都是按照上面的教程学习 ...

  9. Django REST framework+Vue 打造生鲜电商项目(笔记八)

    (form:http://www.cnblogs.com/derek1184405959/p/8862569.html) 十一.pycharm 远程代码调试 第三方登录和支付,都需要有服务器才行(回调 ...

  10. python全栈生鲜电商_Django REST framework+Vue 打造生鲜电商项目(笔记十)

    (from:https://www.cnblogs.com/derek1184405959/p/8877643.html  有修改) 十三.首页.商品数量.缓存和限速功能开发 首先把pycharm环境 ...

最新文章

  1. 【Qt】ubuntu14.04.5 qt5.6中使用opencv3.4报错:Using GTK+ 2.x and GTK+ 3 in the same process is not supported
  2. soul一直显示正在登录聊天服务器,soul这个软件,为什么有些人在玩的时间很久以后(两百天以上),就不会再主动和其他人打招呼了?...
  3. HDU--1872 稳定排序
  4. 点云的无序性_基于深度学习的激光雷达点云物体识别方法总结
  5. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)...
  6. java sleep 精度,java – Thread.sleep(x)是否足以在Android中用作时钟?
  7. [带权并查集] Jzoj P1503 体育场
  8. stm8s单片机2位数码管显示_STM8S103数字电压表头,增加四位显示,串口功能,附源码...
  9. Three.js(十二)——骨骼动画、变形动画
  10. 泰拉瑞亚 1.4 搭建服务器教程
  11. java 身份证第18位数字的算法
  12. 大数据BI解决方案:医疗行业的数据治理
  13. P2178 [NOI2015] 品酒大会(并查集+后缀数组)
  14. 理解类8583报文协议
  15. HTML期末作业-我的大学生活
  16. 智能家居CCC认证办理流程
  17. 345. Reverse Vowels of a String(python+cpp)
  18. Arduino UNO控制HC-SR04超声波实现(测距)及对超声波的认识
  19. 提到区块链,这一次微软没有再落后
  20. 试用D触发器和4选1数据选择器74153设计一个双向3位移位寄存器, 具体要求见下表(A、B为控制端), 左移串行输入信号为L, 右移串行输入信号为R

热门文章

  1. 什么是迁移学习?它都用在深度学习的哪些场景上?
  2. Linux Desktop Entry 文件深入解析
  3. 03.Java语言基础
  4. 使用 PHP Curl 做数据中转
  5. 【筛法】第十万零二个素数
  6. [React Native]StatusBar的使用
  7. 如何用最简单的方法将PCweb改成适合各种设备的web
  8. Rainboy 的ASII码表
  9. Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作
  10. 最让人心动的十大互联网界广告语+超笑评语