1、流程

2、购物车实现
from django.db import models
from utils.MyBaseModel import Base
class Car(Base):
title = models.CharField('商品名称', max_length=24)
price = models.DecimalField('商品价格', max_digits=8, decimal_places=2)
number = models.IntegerField('数量', default=1)
period = models.IntegerField('有效期', default=365)
goods = models.ForeignKey('goodsapp.Goods', on_delete=models.PROTECT, null=True)
users = models.ForeignKey('userapp.User', on_delete=models.CASCADE, null=True)
from rest_framework import serializers
from carapp import models
class CarSer(serializers.ModelSerializer):
class Meta:
model = models.Car
fields = '__all__'
from rest_framework.views import APIView
from rest_framework.response import Response
from carapp import models, serializers
class CarView(APIView):
"""
购物车
"""
def post(self, request):
title = request.data.get('title')
number = request.data.get('number')
price = request.data.get('price')
goods_id = request.data.get('id')
uid = request.user.id
print(title, number, price, goods_id, uid)
try:
car_obj = models.Car.objects.get(goods_id=goods_id, users_id=uid)
car_obj.number += 1
car_obj.save()
except:
car_obj = models.Car.objects.create(title=title, number=number,
price=price, goods_id=goods_id, users_id=uid)
return Response({'code': 200, 'msg': '添加成功', 'data': car_obj.id})
def get(self, request):
uid = request.user.id
car_obj = models.Car.objects.filter(users_id=uid)
ser_obj = serializers.CarSer(car_obj, many=True)
return Response({'code': 200, 'data': ser_obj.data})
3、事务的 运用
原理
1.事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态。
2. 在数据库提交时,可以确保要么所有修改都已保存,要么所有修改都不保存。
特征
1. 原子性(Atomicity):整个事物的所有操作要么全部提交成功,要么全部失败回滚(不会出现部分执行的情况)。
2. 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
3. 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4. 持久性(Durability): 一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
django中应用
from django.db import transaction
try:
with transaction.atomic():
...要执行的多个操作...
return Response({"code": 200,"msg":"成功"})
except IntegrityError:
return Response({"code": 502})
4、订单实现
from django.db import models
from utils.MyBaseModel import Base
class Goods(Base):
"""
商品表
"""
GOODS_TYPE = (
('1', 'Vip'),
('2', 'Course')
)
CHANNEL_TYPE = (
('1', '普通'),
('2', '促销')
)
course = models.ForeignKey('courseapp.Course', on_delete=models.PROTECT)
goods_type = models.CharField('商品种类', choices=GOODS_TYPE, max_length=8)
product_id = models.CharField('产品id', max_length=8)
title = models.CharField('商品名称', max_length=24)
price = models.DecimalField('商品价格', max_digits=8, decimal_places=2)
channel_type = models.CharField('购买渠道', choices=CHANNEL_TYPE, max_length=8)
period = models.IntegerField('有效期', default=365)
is_launched = models.BooleanField('是否上架', default=True)
class Meta:
db_table = 'tb_goods'
def __str__(self):
return self.title
class Orders(Base):
"""
订单表
"""
PAY_METHOD = (
(1, "支付宝"),
)
ORDER_STATUS = (
(1, "待支付"),
(2, "已支付"),
(3, "已取消"),
)
user = models.ForeignKey('userapp.User', on_delete=models.PROTECT, null=True,verbose_name="下单用户")
order_id = models.CharField('本地订单号', max_length=256)
trade_no = models.CharField('支付宝订单号', max_length=32, null=True)
pay_time = models.DateTimeField('支付时间', null=True)
pay_method = models.CharField('支付方式', choices=PAY_METHOD, default=1, max_length=8)
status = models.CharField('支付状态', choices=ORDER_STATUS, default=1, max_length=8)
total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品总金额",null=True)
class Meta:
db_table = 'tb_orders'
def __str__(self):
return self.order_id
class GoodDeatil(Base):
""""
订单详情表
"""
GOODS_TYPE = (
('1', 'Vip'),
('2', 'Course')
)
CHANNEL_TYPE = (
('1', '普通'),
('2', '促销')
)
goods = models.ForeignKey('goodsapp.Goods', on_delete=models.PROTECT,null=True)
orders = models.ForeignKey('goodsapp.Orders', on_delete=models.PROTECT)
number = models.IntegerField("商品数量",null=True)
goods_type = models.CharField('商品种类', choices=GOODS_TYPE, max_length=8,default="2")
title = models.CharField('商品名称', max_length=24)
price = models.DecimalField('商品价格', max_digits=8, decimal_places=2)
channel_type = models.CharField('购买渠道', choices=CHANNEL_TYPE, max_length=8,default="1")
period = models.IntegerField('有效期', default=365)
class Meta:
db_table = 'tb_gooddeatil'
def __str__(self):
return self.title
from rest_framework import serializers
from goodsapp import models as goodsmodel
class OrderSer(serializers.ModelSerializer):
class Meta:
model = goodsmodel.Orders
fields = "__all__"
import uuid
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from carapp.models import Car
from goodsapp import models, serializers
from rest_framework.viewsets import ModelViewSet
from django.db import transaction
class OrderView(APIView):
def post(self, request):
uid = request.user.id
car_list = request.data.get('id_list')
print(car_list)
car_obj = Car.objects.filter(id__in=car_list)
total_money = 0
try:
with transaction.atomic():
uuid_str = str(uuid.uuid4())
order_obj = models.Orders.objects.create(order_id=uuid_str, user_id=uid)
for i in car_obj:
order_detail_obj = models.GoodDeatil.objects.create(
goods=i.goods, orders=order_obj, number=i.number, title=i.title, price=i.price
)
total_money += i.price * i.number
order_obj.total_amount = total_money
order_obj.save()
car_obj.delete()
return Response({'code': 200, 'msg': '订单添加成功'})
except:
return Response({'code': 500, 'msg': '订单添加失败'})
def get(self, request):
uid = request.user.id
order_obj = models.Orders.objects.filter(user_id=uid, status='1')
ser_obj = serializers.OrderSer(order_obj, many=True)
return Response({'msg': '成功', 'code': 200, 'data': ser_obj.data})