购物车和订单表(事务)

订单表一般应用事务来做,同时操作多个数据,保证所有的数据要么同时成功,要不不成功,否则回滚

 

购物车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})

路径正常

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值