商品列表页之排序和分页后端实现

当用户访问网址/list.html?cat=xxx时,会进入商品列表页。网址中的cat参数是用于过滤商品数据的第三级商品类别,也就是说在商品列表中,会根据cat参数筛选商品数据用于展示。

获取商品列表数据

业务需求

需要对商品数据进行分页支持,并且可以按照创建时间(默认)、价格、销量(人气)进行排序。

后端接口设计

请求方式: GET /categories/(?P<category_id>\d+)/skus?page=xxx&page_size=xxx&ordering=xxx

1)在goods/views.py中实现视图

from django.shortcuts import render
from rest_framework.generics import ListAPIView
from rest_framework.filters import OrderingFilter

from .models import SKU
from .serializers import SKUSerializer 
# Create your views here.


# /categories/(?P<category_id>\d+)/skus?page=xxx&page_size=xxx&ordering=xxx
class SKUListView(ListAPIView):
    """商品列表页:分页和排序"""

    # 指定查询集:需要展示的列表数据,需要根绝条件过滤,category_id需要对应,还有必须是未下架的商品
    # queryset = SKU.objects.all()

    # 指定序列化器
    serializer_class = SKUSerializer

    # 这种写法,只对这个视图的分页有效
    # pagination_class = '自定义的分页类,自己制定分页规则'

    # 指定排序和过滤的后端:ordering=price(根据价格小到大) ordering=-price(根据价格大到小)
    filter_backends = [OrderingFilter]
    # 指定排序和过滤的字段:create_time=根据记录的时间排序,price=根据价格排序,sales=根据销量排序
    ordering_fields = ('create_time', 'price', 'sales')

    def get_queryset(self):
        """根据条件刷选出需要展示在列表界面的数据"""
        category_id = self.kwargs.get('category_id')
        return SKU.objects.filter(category_id=category_id, is_launched=True)
说明:

REST framework提供了对于排序的支持,使用REST framework提供的OrderingFilter过滤器后端即可。

OrderingFilter过滤器要使用ordering_fields 属性来指明可以进行排序的字段有哪些。

2)序列化器采用之前实现的SKUSerializer。

3)在meiduo_mall/utils中创建pagination.py文件,在其中创建分页配置类

from rest_framework.pagination import PageNumberPagination

class StandardResultsSetPagination(PageNumberPagination):
    """自定义分页后端"""
    page_size = 2
    page_size_query_param = 'page_size'
    max_page_size = 20

4)在settings.py文件中设置REST framework分页使用的分页类

REST_FRAMEWORK = {
    ...
    # 分页
    'DEFAULT_PAGINATION_CLASS': 'meiduo_mall.utils.pagination.StandardResultsSetPagination',
}

5)在主url.py文件中添加路由:

urlpatterns = [
    ...
    # 商品
    url(r'^', include('goods.urls')),
]

6)在goods/urls.py文件中配置路由:

from django.conf.urls import url

from . import views


urlpatterns = [
    # 商品列表
    url(r'^categories/(?P<category_id>\d+)/skus/', views.SKUListView.as_view()),
]

 

猜你喜欢

转载自www.cnblogs.com/cl-python/p/9291996.html
今日推荐