当用户访问网址/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()), ]