Vue + Django 2.0.6 学习笔记 10.4-10.5 订单管理接口
程序员文章站
2022-03-23 12:27:02
...
先说下订单跟购物车的关系
这里说的是购物车一次性全部结算 而不是像淘宝那么高级的可以选择商品结算的
所以 在生成订单后,购物车的商品需要清空。
然后因为订单的商品数量可能较多 所以当初在设计表的时候 单独设计了订单商品的表。 所以需要将购物车商品增加至订单商品的表中
然后订单中的字段是这样的,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 time
from .models import ShoppingCart, OrderInfo
from goods.serializers import GoodsSerializer
class 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, OrderSerializer
from .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
点击提交
同时 购物车被清空
同时订单的商品信息表中已保存了数据
完结。
推荐阅读
-
Vue + Django 2.0.6 学习笔记 8.3 用户收藏接口实现
-
Vue + Django2.0.6 学习笔记 6-3,在Vue中展示商品分类数据
-
Vue + Django 2.0.6 学习笔记 5.11 过滤2 搜索 排序
-
Vue+Django 2.0.6 学习笔记 5.10 drf过滤
-
Vue + Django 2.0.6 学习笔记 6.1-6.2 商品类别数据接口
-
Vue + Django 2.0.6 学习笔记 7.1 drf的token登录
-
Vue + Django 2.0.6 学习笔记 8.2 热卖商品展示
-
Vue + Django2.0.6 学习笔记 7.6 vue和jwt接口调试
-
Vue + Django 2.0.6 学习笔记 7.8-9 drf实现发送短信验证码接口
-
Vue + Django 2.0.6 学习笔记 8.1 商品详情页的API接口