博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue + Django 2.0.6 学习笔记 10.4-10.5 订单管理接口
阅读量:4126 次
发布时间:2019-05-25

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

先说下订单跟购物车的关系

这里说的是购物车一次性全部结算 而不是像淘宝那么高级的可以选择商品结算的

所以 在生成订单后,购物车的商品需要清空。

然后因为订单的商品数量可能较多 所以当初在设计表的时候 单独设计了订单商品的表。 所以需要将购物车商品增加至订单商品的表中

然后订单中的字段是这样的,order_sn订单号肯定不是客户生成的 而是我们后台生成的,所以这里设置为空 省的调用create函数时报错

trade_no是支付宝传给我们的 这里先为空

class OrderInfo(models.Model):    """    订单    """    ORDER_STATUS = (        ('success', u'成功'),        ('cancel', u'取消'),        ('paying', u'待支付')    )    user = models.ForeignKey(User, verbose_name=u'用户', on_delete=models.CASCADE)# 订单号必须唯一    order_sn = models.CharField(max_length=30, null=True, blank=True, unique=True, verbose_name=u'订单号')    trade_no = models.CharField(max_length=100, unique=True, null=True, blank=True, verbose_name=u'交易号')# 默认为待支付。    pay_status = models.CharField(choices=ORDER_STATUS, default="paying", max_length=10, verbose_name=u'订单状态')    post_script = models.CharField(max_length=11, verbose_name=u'订单留言')    order_mount = models.FloatField(default=0.0, verbose_name=u'订单金额')    pay_time = models.DateTimeField(null=True, blank=True, verbose_name=u'支付时间')    #用户信息# 这里的address不用外键的原因是 后期地址可能随时会改 那这里的订单是在交易状态下生成的 不可能人家后期改地址也把这里改了    address = models.CharField(max_length=100, default='', verbose_name=u'收货地址')    signer_name = models.CharField(max_length=20, default="", verbose_name=u'收货人')    singer_mobile = models.CharField(max_length=11, verbose_name=u'联系电话')    add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加时间')    class Meta:        verbose_name = u'订单'        verbose_name_plural = verbose_name    def __str__(self):        return str(self.order_sn)

订单商品信息:

class OrderGoods(models.Model):    """    订单的商品详情    """    order = models.ForeignKey(OrderInfo, verbose_name=u'订单信息', on_delete=models.CASCADE)    goods = models.ForeignKey(Goods, verbose_name=u'商品', on_delete=models.CASCADE)    goods_num = models.IntegerField(default=0, verbose_name=u'商品数量')    add_time = models.DateTimeField(default=datetime.now, verbose_name=u'添加时间')    class Meta:        verbose_name = u'订单商品'        verbose_name_plural = verbose_name    def __str__(self):        return str(self.order.order_sn)

去建立Serializer

 

import timefrom .models import ShoppingCart, OrderInfofrom goods.serializers import GoodsSerializerclass OrderSerializer(serializers.ModelSerializer):# 这几个都不需要让用户输入所以设置隐藏或只读    user = serializers.HiddenField(        default=serializers.CurrentUserDefault()    )    pay_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)#自定义随机生成函数    def generate_order_sn(self):        #当前时间 + userid + 随机数        from random import Random        random_ins = Random()# 这里没有request。所以需要从self.context["request"]中拿数据        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_sn# 这里是将前端的数据返回给后台处理 所以我们在这里添加上订单号    def validate(self, attrs):        attrs["order_sn"] = self.generate_order_sn()        return attrs    class Meta:        model = OrderInfo        fields = "__all__"

serializer写好了 就去写views

from .serializers import ShopCartSerializer, ShopCartDetailSerializer, OrderSerializerfrom .models import ShoppingCart, OrderInfo, OrderGoods# 订单不存在修改的问题所以不用viewsets.ModelViewSet.class OrderViewset(viewsets.GenericViewSet, mixins.CreateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin):    """    订单管理    list:        获取个人订单    delete:        删除订单    create:        新增订单    """    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)    serializer_class = OrderSerializer    def get_queryset(self):        return OrderInfo.objects.filter(user = self.request.user)# 重写perform_create函数 这个函数原型就是保存数据到数据库中而已。# 我们重写他    def perform_create(self, serializer):# 这条语句就是perform_create的原型语句 一模一样        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.goods            order_goods.goods_num = shop_cart.nums            order_goods.order = order            order_goods.save()# 清空购物车商品            shop_cart.delete()        return order

urls.py

from trade.views import ShoppingCartViewset, OrderViewset#订单router.register('orders', OrderViewset, base_name='orders')

搞定 去看下效果

添加时间可以不填 或者在serializer中设为只读也OK

点击提交

同时 购物车被清空

同时订单的商品信息表中已保存了数据

完结。

转载地址:http://isepi.baihongyu.com/

你可能感兴趣的文章
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
8种ES6中扩展运算符的用法
查看>>
【视频教程】Javascript ES6 教程28—ES6 Promise 实例应用
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>
Flex 布局教程:语法篇
查看>>
年薪50万+的90后程序员都经历了什么?
查看>>
2019年哪些外快收入可达到2万以上?
查看>>
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>
SQL1015N The database is in an inconsistent state. SQLSTATE=55025
查看>>
RQP-DEF-0177
查看>>
Linux查看mac地址
查看>>
Linux修改ip
查看>>
MySQL字段类型的选择与MySQL的查询效率
查看>>