点击商品分类查询商品
流程
-
用户点击三级分类进入这个分类的商品页并发送一个请求
1.1 前端发送的参数有:分类id,页数,一页多少条数据,排序方式
- 后端接收请求和参数
-
前端需要的数据格式
3.1 count为总页数
Django项目实战----点击商品分类查询出商品和销量排行 - 去数据库查询这个分类的对象
- 获取这个分类对象的三级分类,前端需要三级分类的名字弄到面包屑导航上
- 查询这个分类对象下的所有的上架商品数据并按前端给的排序方式排序(按照创建时间)
- 创建分页对象
- 组织数据
- 返回数据
代码
# /list/115/skus/?page=1&page_size=5&ordering=-create_time
class ListView(View):
def get(self, request, category_id):
# 获取前端数据 页数 一页几条数据 排序方式
page = request.GET.get('page')
page_size = request.GET.get('page_size')
ordering = request.GET.get('ordering')
# 查询分类对象
try:
category = GoodsCategory.objects.get(id=category_id)
except Exception as e:
print(e)
return JsonResponse({'code': 400, 'errmsg': '分类查询失败'})
# 获取三级分类的名字
breadcrumb = get_breadcrumb(category)
# 查询分类对象下的所有商家的商品数据
try:
skus = SKU.objects.filter(category=category, is_launched=True).order_by(ordering)
except Exception as e:
print(e)
return JsonResponse({'code': 400, 'errmsg': '查询商品失败'})
# 分页
paginator = Paginator(skus, page_size)
page_skus = paginator.page(page)
# 组织数据
sku_list = []
for sku in page_skus:
sku_list.append({
'id': sku.id,
'name': sku.name,
'price': sku.price,
'default_image_url': sku.default_image.url,
})
# count为总页数
count = paginator.num_pages
# 返回数据
return JsonResponse({'code': 0, 'errmsg': 'ok', 'breadcrumb': breadcrumb, 'list': sku_list, 'count': count})
get_breadcrumb()方法获取三级分类代码
def get_breadcrumb(category):
"""
获取面包屑导航
:param category: 商品类别
:return: 面包屑导航字典
"""
breadcrumb = {
'cat1': '',
'cat2': '',
'cat3': '',
}
if category.parent is None:
# 当前类别为一级类别
breadcrumb['cat1'] = category.name
elif category.parent.parent is None:
# 当前类别为二级
breadcrumb['cat2'] = category.name
breadcrumb['cat1'] = category.parent.name
else:
# 当前类别为三级
breadcrumb['cat3'] = category.name
breadcrumb['cat2'] = category.parent.name
breadcrumb['cat1'] = category.parent.parent.name
return breadcrumb
销量排行的数据
逻辑流程
- 分类商品页发送销量排行请求,传过来分类id
- 根据分类id去数据库查询分类对象,再根据对象查询这个分类下的所有上架的商品数据,并以销量倒序排列
- 组织成前端需要的数据
Django项目实战----点击商品分类查询出商品和销量排行 - 返回数据
代码
这里商品数据有限,注释的为显示10条销量排行的商品数据
# http://www.meiduo.site:8800/hot/115/
class HotGoodsView(View):
def get(self, request, category_id):
"""
查询销量排行
:param request:
:param category_id: 分类id
:return: 返回json数据状态和销量排行的商品数据
"""
try:
# 根据分类id查询分类对象
category = GoodsCategory.objects.get(id=category_id)
except Exception as e:
print(e)
return JsonResponse({'code': 400, 'errmsg': '分类查询失败'})
try:
# 根据分类对象查询商品数据 按销量排序 倒序
skus = SKU.objects.filter(category=category, is_launched=True).order_by('-sales')
except Exception as e:
print(e)
return JsonResponse({'code': 400, 'errmsg': '查询商品失败'})
# count = 1
# hot_sku_list = []
# for sku in skus:
# if count == 10:
# break
# hot_sku_list.append({
# 'id': sku.id,
# 'name': sku.name,
# 'price': sku.price,
# 'default_image_url': sku.default_image.url,
# })
# count += 1
try:
hot_sku_list = [
{
'id': skus[0].id,
'name': skus[0].name,
'price': skus[0].price,
'default_image_url': skus[0].default_image.url,
},
{
'id': skus[1].id,
'name': skus[1].name,
'price': skus[1].price,
'default_image_url': skus[1].default_image.url,
}
]
except Exception as e:
print(e)
hot_sku_list = []
return JsonResponse({'code': 0, 'errmsg': 'ok', 'hot_skus': hot_sku_list})