Day13:13 - 购物车服务(1) - 後端 - 购物车总商品显示、加入购物车API

హలో,我是Charlie!
在Day12当中,我们完成了商品详情显示的API,而今天我们将完成後端的购物车总商品显示跟加入购物车的API。

================================◉‿◉=================================

首先在keyboardmarket\urls.py中新增usercart的urlpattern: 

url('usercart',include('usercart.urls'))

接着在usercart中新增urls.py,并且新增urlpattern:

from django.conf.urls import url
from . import views

urlpatterns = [
	url(r'^$',views.usercart)
]

接着在views.py当中新增usercart def,因为购物车的各种操作都需要token,所以使用logincheck来装饰视图函数:

from tools.R import R
from tools.login_check import logincheck
from .models import Cart

@logincheck('GET','POST','PUT','DELETE')
def usercart(request):
	return R.ok("API reachable")

首先是新增购物车的方法,新增购物车的话会需要几个东西:

  1. username
  2. productID
  3. amount

所以接收到的JSON必须包含这三个,才能从user跟product当中捞取正确的用户跟商品,amount则是加入购物车的数量。

所以首先我们先创立用来处理购物车请求的model:

import json

class CartModel:
	def __init__(self,product_id = 0,username = "",amount = 0):
		self.product_id = product_id
		self.username = username
		self.amount = amount

	def fromJson(self,data):
		jsondata = json.loads(data)
		self.product_id = jsondata["pid"]
		self.username = jsondata["username"]
		self.amount = jsondata["amount"]

接着在views.py当中分别引入Cart model、Product model、User model、CartStatus Enum:

from .models import Cart
from tools.models.cartModel import CartModel
from product.models import Product
from users.models import User
from tools.db import CartStatus

然後判断request method为POST,判断如果商品存在、数量合理则可加入购物车,如果商品存在的话就加上数量,如果商品不存在的话则创建:

if request.method == "POST":
	req = request.body
	ucart = CartModel()
	ucart.fromJson(req)
	if ucart.amount == 0:
		return R.badRequest("Add cart amount can not be 0")
	product = Product.objects.filter(id = ucart.product_id)
	if not product:
		return R.badRequest("Product does not exist")
	product = product[0]
	if ucart.amount > product.stored_amount:
		return R.badRequest("Add cart amount reach maximum stored amount")
	user = User.objects.filter(name = ucart.username)
	if not user:
		return R.badRequest("User does not exist")
	user = user[0]
	dbcart = Cart.objects.filter(user = user).filter(product = product)
	if dbcart:
		dbcart[0].amount += ucart.amount
		dbcart[0].save()
	else:
		cart = Cart.objects.create(
			product = product,
			user = user,
			amount = ucart.amount,
			status = CartStatus.activate.value
		)
		cart.save()

用POSTMAN测试:
https://ithelp.ithome.com.tw/upload/images/20210927/20141666TQk8LlpJ6G.png

还有购物车的总商品显示,先在Cart model当中新增toJson方法:

def toJson(self):
	data = {}
	data["id"] = self.id
	data["product"] = self.product.toJson()
	data["username"] = self.user.name
	data["amount"] = self.amount
	data["status"] = self.status
	data["created_time"] = self.created_time
	data["modified_time"] = self.modified_time
	return data

在urls.py中新增路径:

url(r'/(?P<username>[\w]{1,55})$',views.usercart),

并且在usercart中新增参数跟方法:

@logincheck('GET','POST','PUT','DELETE')
def usercart(request,username = None):
	if request.method == "GET":
		user = User.objects.filter(name = username)
		if not user:
			return R.badRequest("User does not exist")
		user = user[0]
		carts = Cart.objects.filter(user = user)
		return R.ok(carts)

测试:
https://ithelp.ithome.com.tw/upload/images/20210927/20141666fdz9ONpyTR.png

================================◉‿◉=================================

Day13结束了!在今天我们完成了购物车的商品显示跟加入购物车,明天我们将完成前端的部分,See ya next day!


<<:  DAY27 - [React] useEffect

>>:  绘图 - 即时成交资料

Day_14 : 让 Vite 来开启你的Vue 之 Composition API

Hi Dai Gei Ho~ 我是Winnie~ 在今天的内容中,此篇文章将要来说 Composit...

机器学习:演算法

线性代数 LR:逻辑回归(Logistic Regression): 预测事件发生的机率(y=1)...

Day15 - [丰收款] 撰写Django的Model,使用ORM和Heroku Postgres绑一起。

今天面临了断更的危机! 本人从昨晚开始肠胃不适,整晚翻来覆去无法入眠,早上更严重,请假了一整天,接着...

[从0到1] C#小乳牛 练成基础程序逻辑 Day 5 - 资料类型 $字串插补

你喜欢什麽类型? | 实质的那一种 | $$$$$$爱了 🐄点此填写今日份随堂测验 ...

Advance Outsourcing Accounting Service in Uk

Accounting service is considered a part of the ove...