1.创建应用order
略
2.配置settings.py
略
3.配置路由
# 订单模块
path('v1/orders/', include('order.urls')),
from django.urls import path
from . import views
urlpatterns = [
path('<str:username>/advance', views.AdvanceView.as_views()),
]
视图撰写
from django.core.cache import caches
from django.http import JsonResponse
from django.shortcuts import render
from goods.models import SKU
from user.models import Address
from utils.baseview import BaseView
# Create your views here.
class AdvanceView(BaseView):
def get(self, request, username):
"""
确认订单页视图逻辑
"""
user = request.user
# 1.address处理
addresses = []
all_address = Address.objects.filter(user_profile=user, is_active=True)
for item in all_address:
add = {
"id": item.id,
"name": item.receiver,
"mobile": item.receiver_mobile,
"title": item.tag,
"address": item.address
}
# 默认地址放第一个,非默认放后面
if item.is_default:
addresses.insert(0, add)
else:
addresses.append(add)
print(addresses)
# 2.sku_list处理
# settlement_type=0-购物车;1-立即购买
typ = request.GET.get("settlement_type")
sku_list = []
# 购物车-结算
if typ == '0':
# 尝试从缓存中读取数据
cache_key = f"carts_{user.id}"
carts_data = caches["carts"].get(cache_key)
if not carts_data:
carts_data = {}
skus = SKU.objects.filter(id__in=carts_data.keys())
for item in skus:
sku = {
"id": item.id,
"name": item.name,
"count": carts_data[str(item.id)],
"selected": 1,
"default_image_url": str(item.default_image_url),
"price": item.price,
"sku_sale_attr_name": [i.spu_sale_attr.name for i in item.sale_attr_value.all()],
"sku_sale_attr_val": [i.name for i in item.sale_attr_value.all()]
}
sku_list.append(sku)
# 选出筛选状态为1的商品
# sku_list = [sku for sku in sku_list if sku["selected"] == 1]
# 立即购买
elif typ == '1':
# 查询字符串中获取商品信息[sku_id=2&buy_num=3]
sku_id = request.GET.get("sku_id")
buy_num = request.GET.get("buy_num")
if not all([sku_id, buy_num]):
return JsonResponse({"code": 10500, "error": "参数有误"})
try:
sku = SKU.objects.get(id=sku_id, is_launched=True)
except Exception as e:
print("error", e)
return JsonResponse({"code": 10501, "error": "商品下架了~"})
sku_list = [{
"id": sku.id,
"name": sku.name,
"count": int(buy_num),
"selected": 1,
"default_image_url": str(sku.default_image_url),
"price": sku.price,
"sku_sale_attr_name": [i.spu_sale_attr.name for i in sku.sale_attr_value.all()],
"sku_sale_attr_val": [i.name for i in sku.sale_attr_value.all()]
}]
result = {
"code": 200,
"data": {
"addresses": addresses,
"sku_list": sku_list
},
"base_url": "http://127.0.0.1:8000/media/"
}
return JsonResponse(result)