京西商城——购物车接口开发

  1. 要先判断请求中用户ID,商品ID以及 添加或删除
  2. 如果用户ID在数据库中没有购物车对象,那么创建并添加数据;
  3. 如果用户ID在数据库中有购物车对象,就判断该购物车对象中是否有该商品对象
  4. 如果有就判断是添加还是删除行为,然后修改该购物车表及购物车项信息;
  5. 如果没有就添加到购物车项表,并修改购物车表信息

在某个购物车对象的某个购物车项的数量为0时,应该删除该购物车项,但是为了数据的完整性,可以在购物车项添加一个is_delete属性来表示该购物车项是否还在购物车对象中。而如果该购物车再次添加数据时也要修改is_dalate。

理论成立,实践开始。

from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from apps.cart.models import Cart, CartItem
from apps.cart.serializers import CartSerializer, CartItemSerializer
from apps.goods.models import Goods
from apps.goods.serializers import GoodsSerializer
from utils import ResponseMessage

class CartAPIView(APIView):
    # @todo 在添加数据之前要先进行权限验证

    # http://localhost:8000/cart/list/
    # {
    #     "user_id": 3,
    #     "good_id": 4,
    #     "num": 1,
    #     "action":"add/remove"
    # }
    def post(self, request):
        print(request.data)
        user_id = request.data.get('user_id')
        good_id = request.data.get('good_id')
        num = request.data.get('num')
        action = request.data.get('action')
        # print(cart_id, good_id, num)

        # 先把修改的总金额算出来,方便后面直接使用
        good = get_object_or_404(Goods, good_id=good_id)
        change_price = good.price * num

        cart = Cart.objects.filter(user_id=user_id).first()
        # print(cart)
        if cart:
            # 购物车存在,判断购物车里是否有该商品
            item = cart.item.filter(good=good_id).first()
            # print(item)
            if item:
                # 该商品在该购物车存在
                if action == 'add':
                    # 添加商品
                    item.num += num
                    if item.num != 0:
                        item.is_delete = False
                    item.save()
                    cart.total_goods_number += num
                    cart.total_price += change_price
                    cart.save()
                    return HttpResponse("商品又被您添加到购物车啦,喜欢就赶紧下单吧!")
                elif action == 'remove':
                    # 移除商品
                    item.num -= num
                    if item.num == 0:
                        item.is_delete = True
                    item.save()
                    cart.total_goods_number -= num
                    cart.total_price -= change_price
                    cart.save()
                    return HttpResponse("商品已经从购物车移除")
            else:
                # 该商品在该购物车不存在
                item = cart.item.create(cart=cart, good=good, num=num)
                # item = CartItem.objects.create(cart=cart, good=good, num=num)
                # 修改Cart的实例属性数据
                cart.total_goods_number += num
                cart.total_price += change_price
                cart.save()
                return HttpResponse("商品已经添加到您的购物车啦")
        else:
            # 购物车不存在
            # good = get_object_or_404(Goods, good_id=good_id)
            # # print(good.price)
            # total_price = good.price * num
            cart = Cart.objects.create(user_id=user_id, total_goods_number=num, total_price=change_price)
            cart_item = CartItem.objects.create(num=num, good_id=good_id, cart_id=cart.cart_id)
            return HttpResponse("购物车创建成功,商品添加成功")

    # http://localhost:8000/cart/list/?cart_id=1
    def get(self, request):
        cart_id = request.GET.get('cart_id')
        # 使用 get_object_or_404 获取单个 Cart 实例
        # cart = Cart.objects.filter(cart_id=cart_id).first()
        cart = get_object_or_404(Cart, cart_id=cart_id)
        # 序列化 Cart 实例
        cart_data = CartSerializer(instance=cart).data

        # 使用 related_name 'item' 从 Cart 实例获取关联的 CartItem 实例
        cart_items = cart.item.filter(is_delete=False)
        # 序列化关联的 CartItem 实例
        cart_item_data = CartItemSerializer(instance=cart_items, many=True).data
        # print(cart_items)

        good_info_data = []
        for item in cart_items:
            # 直接通过外键来获取good对象
            good = item.good
            # print(good)
            # 序列化关联的 Goods 实例
            good_info = GoodsSerializer(good).data
            good_info_data.append(good_info)

        response_data = {
            'cart': cart_data,
            'cart_items': cart_item_data,
            'good': good_info_data
        }
        print(response_data)
        return ResponseMessage.CartResponse.success(response_data)
cart/serializer.py
from rest_framework import serializers
from apps.cart.models import Cart, CartItem


class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = '__all__'

class CartItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = CartItem
        fields = '__all__'
cart/urls.py
from django.urls import path
from .views import CartAPIView

urlpatterns = [
    path('list/', CartAPIView.as_view(), name='cart_list')
]

若有错误与不足请指出,关注DPT一起进步吧!!!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我DPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值