订单表一般应用事务来做,同时操作多个数据,保证所有的数据要么同时成功,要不不成功,否则回滚
购物车models
from django.db import models
from goods.models import *
# Create your models here.
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('goods.Goods',on_delete=models.PROTECT,null=True)
users=models.ForeignKey('userapp.User',on_delete=models.CASCADE,null=True)
序列化正常即可
views
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
# Create your views here.
from cars.models import Car
from cars.serializer import CarSer
class CarS(APIView):
def post(self, reqeust):
title = reqeust.data.get('title')
number = reqeust.data.get('number')
price = reqeust.data.get('price')
goods_id = reqeust.data.get('id')
id = reqeust.user.id
try:
car_obj = Car.objects.get(goods_id=goods_id)
car_obj.number += 1
car_obj.save()
except:
car_obj = Car.objects.create(title=title, number=number, price=price, goods_id=goods_id, users_id=id)
return Response({'code': 200, "msg": '购物车添加成功', 'data': car_obj.id})
def get(self,request):
uid=request.user.id
car_obj=Car.objects.filter(users_id=uid)
ser_obj=CarSer(car_obj,many=True)
return Response({'code':200,'data':ser_obj.data})
def delete(self,request):
return Response({"code":200,'data':''})
def put(self,request):
return Response({"code":200,'data':""})
接口路径正常即可
订单表/model
from django.db import models
# Create your models here.
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) # 28位
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('goods.Goods', on_delete=models.PROTECT,null=True)
orders = models.ForeignKey('goods.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
views.py
import uuid
from sqlite3 import IntegrityError
from django.shortcuts import render
# Create your views here.
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from django.db import transaction
from cars.models import Car
from goods.models import Goods, Orders, GoodDeatil
from goods.serializer import GoodsSer, OrderSer
class GoodsView(ModelViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsSer
class OrderCreate(APIView):
def post(self, request):
uid = request.user.id
id_list = request.data.get('id_list')
# 逻辑与处理 (必须全部要么都成功,要么都失败)
# 查询出来所有的商品信息,为后续做准备
print(id_list)
car_obj = Car.objects.filter(id__in=id_list)
print(car_obj)
print(uid)
all_price = 0
try:
with transaction.atomic():
uuid_str = str(uuid.uuid4())
order_obj = Orders.objects.create(order_id=uuid_str,user_id=uid)
print(order_obj)
for i in car_obj:
# 2.1要知道详情表是在那个订单的详情信息(知道order的主键)
# 2.2 要把存在的商品信息一个个的添加进去
print(i.goods)
order_detail_obj = GoodDeatil.objects.create(
goods=i.goods, orders=order_obj, number=i.number, price=i.price, title=i.title
)
all_price += i.price * i.number
order_obj.total_amount = all_price
order_obj.save()
car_obj.delete()
return Response({"code": 200, "msg": "成功"})
except Exception as e:
raise e
return Response({'code': 500, 'msg': '失败'})
def get(self, request):
uid = request.user.id
order_obj = Orders.objects.filter(user_id=uid, status='1')
ser_obj = OrderSer(order_obj, many=True)
return Response({"msg": '成功', 'code': 200, 'data': ser_obj.data})
路径正常