天天看點

Django項目實戰----點選商品分類查詢出商品和銷量排行

點選商品分類查詢商品

流程

  1. 使用者點選三級分類進入這個分類的商品頁并發送一個請求

    1.1 前端發送的參數有:分類id,頁數,一頁多少條資料,排序方式

  2. 後端接收請求和參數
  3. 前端需要的資料格式

    3.1 count為總頁數

    Django項目實戰----點選商品分類查詢出商品和銷量排行
  4. 去資料庫查詢這個分類的對象
  5. 擷取這個分類對象的三級分類,前端需要三級分類的名字弄到面包屑導航上
  6. 查詢這個分類對象下的所有的上架商品資料并按前端給的排序方式排序(按照建立時間)
  7. 建立分頁對象
  8. 組織資料
  9. 傳回資料

代碼

# /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

           

銷量排行的資料

邏輯流程

  1. 分類商品頁發送銷量排行請求,傳過來分類id
  2. 根據分類id去資料庫查詢分類對象,再根據對象查詢這個分類下的所有上架的商品資料,并以銷量倒序排列
  3. 組織成前端需要的資料
    Django項目實戰----點選商品分類查詢出商品和銷量排行
  4. 傳回資料

代碼

這裡商品資料有限,注釋的為顯示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})