1. 后端接口设计
请求方式 : POST /orders/
请求参数: JSON 或 表单
参数类型是否必须说明
address
int
是
收货地址id
pay_method
int
是
支付方式
返回数据: JSON
参数类型是否必须说明
order_id
char
是
订单编号
2. 后端实现
在orders/views.py中创建视图
class SaveOrderView(CreateAPIView):
"""
保存订单
"""
permission_classes = [IsAuthenticated]
serializer_class = SaveOrderSerializer
在orders/serializers.py中创建序列化器
class SaveOrderSerializer(serializers.ModelSerializer):
"""
下单数据序列化器
"""
class Meta:
model = OrderInfo
fields = ('order_id', 'address', 'pay_method')
read_only_fields = ('order_id',)
extra_kwargs = {
'address': {
'write_only': True,
'required': True,
},
'pay_method': {
'write_only': True,
'required': True
}
}
def create(self, validated_data):
"""保存订单"""
pass
保存订单的思路
def create(self, validated_data):
# 获取当前下单用户
# 生成订单编号
# 保存订单基本信息数据 OrderInfo
# 从redis中获取购物车结算商品数据
# 遍历结算商品:
# 判断商品库存是否充足
# 减少商品库存,增加商品销量
# 保存订单商品数据
# 在redis购物车中删除已计算商品数据
数据库事务
在保存订单数据中,涉及到多张表(OrderInfo、OrderGoods、SKU)的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败。
Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交。我们需要在保存订单中自己控制数据库事务的执行流程。
在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用法
装饰器用法
from django.db import transaction
@transaction.atomic
def viewfunc(request):
# 这些代码会在一个事务中执行
...
with语句用法
from django.db import transaction
def viewfunc(request)