5 - 商品管理
5.1.规格表管理
在规格表中我们需要对规格表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作
5.1.1.查询获取规格表列表数据
接口分析
请求方式: GET /meiduo_admin/goods/specs/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{
"counts": "SPU商品规格总数量",
"lists": [
{
"id": "规格id",
"name": "规格名称",
"spu": "SPU商品名称",
"spu_id": "SPU商品id"
},
...
],
"page": "页码",
"pages": "总页数",
"pagesize": "页容量"
}
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
count | int | 是 | 总量 |
lists | 数组 | 是 | 规格表信息 |
page | int | 是 | 页码 |
pages | int | 是 | 总页数 |
pagesize | int | 是 | 页容量 |
后端实现
class SpecsView(ModelViewSet):
serializer_class = SPUSpecificationSerializer
queryset = SPUSpecification.objects.all()
pagination_class = PageNum
序列化器的定义
class SPUSpecificationSerializer(serializers.ModelSerializer):
# 关联嵌套返回spu表的商品名
spu=serializers.StringRelatedField(read_only=True)
# 返回关联spu的id值
spu_id=serializers.IntegerField()
class Meta:
model = SPUSpecification # 商品规格表关联了spu表的外键spu
fields='__all__'
5.1.2.保存规格表数据表数据
接口分析
请求方式:POST /meiduo_admin/goods/specs/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | str | 是 | 规格名称 |
spu_id | int | 是 | SPU商品id |
返回数据: JSON
{
"id": "规格id",
"name": "规格名称",
"spu": "SPU商品名称",
"spu_id": "SPU商品id"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 规格id |
name | Str | 是 | 规格名称 |
spu | str | 是 | SPU商品名称 |
spu_id | Int | 是 | spu商品id |
后端实现
# SpecsView继承的是ModelViewSet 所以保存逻辑还是使用同一个类视图
class SpecsView(ModelViewSet):
serializer_class =SPUSpecificationSerializer
queryset = SPUSpecification.objects.all()
pagination_class = PageNum
5.1.3.更新规格表数据
1、 获取要修改规格表的详情信息
点就修改按钮时,我们需要先获取要修改的规格详情信息
接口分析
请求方式: GET /meiduo_admin/goods/specs/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在头部中携带要获取的规格ID
返回数据: JSON
{
"id": "规格id",
"name": "规格名称",
"spu": "SPU商品名称",
"spu_id": "SPU商品id"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 规格 ID |
name | str | 是 | 规格名称 |
spu | str | 是 | SPU商品名称 |
spu_id | int | 是 | SPU商品id |
后端实现
# SpecsView继承的是ModelViewSet 所以获取单一规格逻辑还是使用同一个类视图
class SpecsView(ModelViewSet):
serializer_class =SPUSpecificationSerializer
queryset = SPUSpecification.objects.all()
pagination_class = PageNum
2、修改规格表数据
接口分析
请求方式: PUT /meiduo_admin/goods/specs/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
name | str | 是 | 规格名称 |
spu_id | int | 是 | 商品SPU ID |
返回数据: JSON
{
"id": "规格id",
"name": "规格名称",
"goods": "SPU商品名称",
"goods_id": "SPU商品id"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 规格 ID |
name | str | 是 | 规格名称 |
spu | str | 是 | SPU商品名称 |
spu_id | int | 是 | SPU商品id |
后端实现
# SpecsView继承的是ModelViewSet 所以修改逻辑还是使用同一个类视图
class SpecsView(ModelViewSet):
"""
规格表视图
"""
serializer_class =SPUSpecificationSerializer
queryset = SPUSpecification.objects.all()
pagination_class = PageNum
5.1.4.删除规格表数据
接口分析
请求方式: Delte /meiduo_admin/goods/specs/(?P<pk>\d+)/
请求参数: 通过请求头传递jwt token数据。
在路径中携带删除的规格的id值
返回数据: JSON
返回空
后端实现
# SpecsView继承的是ModelViewSet 所以删除逻辑还是使用同一个类视图
class SpecsView(ModelViewSet):
"""
规格表视图
"""
serializer_class =SPUSpecificationSerializer
queryset = SPUSpecification.objects.all()
pagination_class = PageNum
5.2.图片管理
在图片表中我们需要对图片数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作
5.2.1.获取图片列表数据
接口分析
请求方式: GET /meiduo_admin/skus/images/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
{
"counts": "图片总数量",
"lists": [
{
"id": "图片id",
"sku": "SKU商品id",
"image": "图片地址"
}
...
],
"page": "页码",
"pages": "总页数",
"pagesize": "页容量"
}
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
count | int | 是 | 图片总量 |
lists | 数组 | 是 | 图片信息 |
page | int | 是 | 页码 |
pages | int | 是 | 总页数 |
pagesize | int | 是 | 页容量 |
后端实现
class ImageView(ModelViewSet):
# 图片序列化器
serializer_class = ImageSeriazlier
# 图片查询集
queryset = SKUImage.objects.all()
# 分页
pagination_class = PageNum
序列化器的定义
class ImageSeriazlier(serializers.ModelSerializer):
# 返回图片关联的sku的id值
sku=serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model=SKUImage
fields=('sku','image','id')
5.2.2.保存图片数据
在保存数据之前我们需要先获取图片关联的sku的id
1、获取sku表id
接口分析
请求方式: GET /meiduo_admin/skus/simple/
请求参数: 通过请求头传递jwt token数据。
返回数据: JSON
[
{
"id": 1,
"name": "Apple MacBook Pro 13.3英寸笔记本 银色"
},
{
"id": 2,
"name": "Apple MacBook Pro 13.3英寸笔记本 深灰色"
},
......
]
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
Id | int | 是 | sku商品id |
name | 数组 | 是 | Sku商品名称 |
后端实现
class ImageView(ModelViewSet):
serializer_class = ImageSeriazlier
queryset = SKUImage.objects.all()
pagination_class = PageNum
# 获取sku商品信息
def simple(self,request):
data = SKU.objects.all()
ser = SKUSeriazlier(data,many=True)
return Response(ser.data)
序列化器的定义
class SKUSeriazlier(serializers.ModelSerializer):
class Meta:
model=SKU
fields=('id','name')
2、保存图片数据
接口分析
请求方式:POST /meiduo_admin/skus/images/
请求参数: 通过请求头传递jwt token数据。
表单提交数据:
"sku": "SKU商品id",
"image": "SKU商品图片"
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku | str | 是 | SKU商品id |
image | Fiel | 是 | SKU商品图片 |
返回数据: JSON
{
"id": "图片id",
"sku": "SKU商品id",
"image": "图片地址"
}
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | Int | 是 | 图片id |
sku | int | 是 | SKU商品id |
image | str | 是 | 图片地址 |
后端实现
在保存图片的同时,我们还需要异步生成新的详情页页面,这是我们需要定义异步任务
import os
from django.conf import settings
from django.shortcuts import render
from goods.models import SKU
from meiduo_mall.utils.breadcrumb import get_breadcrumb
from meiduo_mall.utils.categories import get_categories
from celery_tasks.main import app
@app.task(name='get_detail_html')
def get_detail_html(sku_id):
# 获取当前sku对象
sku=SKU.objects.get(id=sku_id)
# 分类数据
categories = get_categories()
# 获取面包屑导航
breadcrumb = get_breadcrumb(sku.category)
# 获取spu
spu = sku.spu
# 获取规格信息:sku===>spu==>specs
specs = spu.specs.order_by('id')
# 查询所有的sku,如华为P10的所有库存商品
skus = spu.skus.order_by('id')
'''
{
选项:sku_id
}
说明:键的元组中,规格的索引是固定的
示例数据如下:
{
(1,3):1,
(2,3):2,
(1,4):3,
(2,4):4
}
'''
sku_options = {
}
sku_option = []