获取商品列表数据
业务需求
需要对商品数据进行分页支持,并且可以按照创建时间(默认)、价格、销量(人气)进行排序。
后端接口设计
请求方式: GET /categories/(?P<category_id>\d+)/skus?page=xxx&page_size=xxx&ordering=xxx
请求参数: 路径参数 + 查询字符串参数
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
categroy_id | int | 是 | 类别id(第三级类别) |
page | int | 是 | 页数 |
page_size | int | 否 | 每页数量 |
ordering | str | 是 | 排序关键字('create_time', 'price', 'sales') |
返回数据: JSON
{
"count": 14,
"next": "http://api.meiduo.site:8000/categories/115/skus/?page=2",
"previous": null, "results": [ { "id": 3, "name": "Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机", "price": "6499.00", "default_image_url": "http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRZCqAUxp9AAFti6upbx41220032", "comments": 0 }, { "id": 4, "name": "Apple iPhone 8 Plus (A1864) 256GB 金色 移动联通电信4G手机", "price": "7988.00", "default_image_url": "http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRZa6ANO_sAAFti6upbx40753757", "comments": 0 } ] }
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
count | int | 是 | 数据总数 |
next | url | 是 | 下一页的链接地址 |
previous | url | 是 | 上一页的链接地址 |
results | sku[] | 是 | 商品sku数据列表 |
id | int | 否 | 商品sku 编号 |
name | str | 否 | 商品名称 |
price | decimal | 否 | 单价 |
default_image_url | str | 否 | 默认图片 |
comments | int | 否 | 评论量 |
后端实现
在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
在配置文件中设置REST framework分页使用的分页类
REST_FRAMEWORK = {
...
# 分页
'DEFAULT_PAGINATION_CLASS': 'meiduo_mall.utils.pagination.StandardResultsSetPagination',
}
序列化器采用之前实现的SKUSerializer。
在goods/views.py中实现视图
from rest_framework.filters import OrderingFilter
class SKUListView(ListAPIView): """ sku列表数据 """ serializer_class = SKUSerializer filter_backends = (OrderingFilter,) ordering_fields = ('create_time', 'price', 'sales') def get_queryset(self): category_id = self.kwargs['category_id'] return SKU.objects.filter(category_id=category_id, is_launched=True)
说明:
REST framework提供了对于排序的支持,使用REST framework提供的OrderingFilter过滤器后端即可。
OrderingFilter过滤器要使用ordering_fields 属性来指明可以进行排序的字段有哪些。