DRF实战5 - 商品管理

5 - 商品管理

5.1.规格表管理

在规格表中我们需要对规格表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作

sku

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来完成相应的操作

sku

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

createsku

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 = []
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值