SKU表管理
在sku表中我们需要对SKU表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作
【商品的详细信息,要引入事务的管理,对于多张表的处理需要使用事务】
在获取sku数据时,我们在请求中包含了查询关键keyword,这时我么就需要对keyword进行判断,来返回不同的查询数据
接口分析请求方式: GET /meiduo_admin/skus/?keyword=&page=&page_size=
from .views import skus
from rest_framework.routers import DefaultRouter
# sku表查询路由****************************
router = DefaultRouter()
router.register('skus', skus.SKUGoodsView, base_name='sku')
urlpatterns += router.urls
【上面两个自动生成路由有包含关系,所以要注意上下放置的位置】
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{
"counts": "商品SPU总数量",
"lists": [
{
"id": "商品SKU ID",
"name": "商品SKU名称",
"spu": "商品SPU名称",
"spu_id": "商品SPU ID",
"caption": "商品副标题",
"category_id": "三级分类id",
"category": "三级分类名称",
"price": "价格",
"cost_price": "进价",
"market_price": "市场价格",
"stock": "库存",
"sales": "销量",
"is_launched": "上下架",
"specs": [
{
"spec_id": "规格id",
"option_id": "选项id"
},
...
]
},
...
],
"page": "页码",
"pages": "总页数",
"pagesize": "页容量"
}
返回值类型是否必须说明countint是SKUs商总量lists数组是SKU信息pageint是页码pagesint是总页数pagesizeint是页容量
后端实现
from rest_framework.viewsets import ModelViewSet
from meiduo_admin.serializers.skus import SKUGoodsSerializer
from meiduo_admin.utils import UserPageNum
from goods.models import SKU
class SKUGoodsView(ModelViewSet):
# 指定序列化器
serializer_class = SKUGoodsSerializer
# 指定分页器 进行分页返回
pagination_class = UserPageNum
# 重写get_queryset方法,判断是否传递keyword查询参数
def get_queryset(self):
# 提取keyword
keyword = self.request.query_params.get('keyword')
if keyword == '' or keyword is None:
return SKU.objects.all()
else:
return SKU.objects.filter(name=keyword)
序列化器的定义
from rest_framework import serializers
from goods.models import SKU, SKUSpecification
class SKUSpecificationSerialzier(serializers.ModelSerializer):
"""
SKU规格表序列化器
"""
spec_id = serializers.IntegerField(read_only=True)
option_id = serializers.IntegerField(read_only=True)
class Meta:
model = SKUSpecification # SKUSpecification中sku外键关联了SKU表
fields = ("spec_id", 'option_id')
class SKUGoodsSerializer(serializers.ModelSerializer):
"""
获取sku表信息的序列化器
"""
# 指定所关联的选项信息 关联嵌套返回
specs = SKUSpecificationSerialzier(read_only=True, many=True)
# 指定分类信息
category_id = serializers.IntegerField()
# 关联嵌套返回
category = serializers.StringRelatedField(read_only=True)
# 指定所关联的spu表信息
spu_id = serializers.IntegerField()
# 关联嵌套返回
spu = serializers.StringRelatedField(read_only=True)
class Meta:
model = SKU # SKU表中category外键关联了GoodsCategory分类表。spu外键关联了SPU商品表
fields = '__all__'
运行效果: