完整电商项目--(六)商品模块(7):商品详情页

商品详情页业务分析

  • 1.商品频道分类(讲过)
  • 2.面包屑导航(讲过)
  • 3.热销排行(讲过)
  • 4.商品SKU信息(详情信息)(查询)
  • 5.SKU规格信息(讲过)
  • 6.商品详情介绍、规格与包装、售后服务(查询)
  • 7.商品评价(查询)
  • 8.访问量统计
    其他的都没得说,我们主要讲解商品的详情页的 sku 规格展示
    在这里插入图片描述

业务

spu商品规格查询

  • 就是我们上面的图片中的框中的信息,我们还是说下,后面好接着理解。

第一步:明确这是商品详情页!

  • 也就是具体的sku商品的信息
  • 其中我们知道这个商品的id, 且展示规格的时候,可以发现,规格选项是选择好的这个商品的

在这里插入图片描述

第二步:查询规格选项信息

  • 方法: 参考之前的模型(数据表)的关系讲解,其实很简单实现了。
  • 通过 商品id,查询spu商品模型对象==》通过外键查询对应的sku模型对象==》之后外键查询出所有的对应的规格模型对象(比如尺寸,颜色,内存)==》再查询出来,每个规格 所对应的规格选项(比如颜色:蓝色,黑色,白色)
  • 之后构造好数据结构即可,前端后端不分离很简单,直接返回查询对象即可。

规格选项上的链接构造:

**重点来了!

  • ** 观察上图我们发现,版本选择的是 8G128GB的,当我们要换其他的配置时,是怎么确定 具体商品的链接的呢?然后实现跳转的?
    在这里插入图片描述
  • 可以发现每次更换配置选项,前端都会发送请求,返回当前的 sku商品的信息。
  • 实现: 发现规律: 我们鼠标每次只能点击更换一个配置选项,也就是说,两个商品之间,唯一不同的只有一个配置选项不同! 这就启发了我们,在上面传递 规格选项信息的时候,每个规格选项其实 都能根据当前的 sku商品信息去构建 确定的商品id, 也就是我们确定的将每个 商品规格信息,绑定一个 商品id值,发送给前端,当用户改变当前商品页的某个 规格选项时,前端就知道该向后端请求哪个详情的商品,因为每个规格绑定了一个 商品id信息。
  • 也就是说:我们通过当前的商品,返回规格选项的时候,每次都要在每个规格选项后面绑定商品id。
  • 数据结构构造:
    我们把上面讲的步骤都连起来看下:
# 获取商品对应的spu, 获取里面的信息
        spu = sku.spu
# 获取商品的规格信息(就是比如 颜色,配置,尺寸等抽象,规格)
        # sku==>spu==>specs(外键指定的属性名)
        specs = spu.specs.order_by('id')
# 通过最开始通过sku_id,查询到sku,再查询到spu,通过spu对应的外键,查询到 spu对应的所有sku商品
        skus = spu.skus.order_by('id')
# 下面是准备工作: 我们构造所有sku商品的信息
'''

        构造这段数据的目的就是: 通过这个字典,为下面每一个类型的商品添加一个 id,点击不同的类型,可以切换到不同的商品
                {
                    选项:sku_id     (选项就是一个元组,里面的值是对应的规格的 规格选项值id)
                }
                说明:键的元组中,规格的索引是固定的
                示例数据如下: 假设华为手机有两个配置,颜色和内存(元组中每个元素代表对应规格的选项,位置是固定的,比如第一个位置表示颜色,第二个位置标识配置的选项id)
                {
                    (1,3):1,        # 元组里:1表示颜色规格对应的选项值,假如是对应红色,  3代表内存规格对应的选项 加入128G, 后面的值,代表商品id
                    (2,3):2,
                    (1,4):3,
                    (2,4):4
                }
      # 注意,两种规格就是有四种具体 sku商品组合
        '''
# 获取上述结构数据
		sku_options= {
    
    }
        sku_option = []
        for sku1 in skus:
            infos = sku1.specs.order_by('spec_id')  # 通过外键获得sku商品的所有规格选项id, 然后将这些获得的规格选项按照 规格的顺序进行排序(规格在另外一张表中的id来排序)
            option_key = []
            for info in infos:
                option_key.append(info.option_id) # 获取选项的id,放到列表里面
                # 获取当前商品的规格信息,因为要默认选择的
                if sku.id == sku1.id:
                    sku_option.append(info.option_id)

            # 下面开始构造上面格式的数据,列表值是可变的不能作为字典的键,所以转换为元组
            sku_options[tuple(option_key)]=sku1.id  # 键的值就是商品的id

# 下面就是为当前商品为基础,为每个规格选项绑定具体的商品id了! 要用的上面得出的数据
# 遍历当前的spu所有的规格
        specs_list = []
        for index, spec in enumerate(specs):  # enumerate(), 通过这个方法,可以遍历出来 列表的元素和对应的索引
            option_list = []
            for option in spec.options.all():
                # 如果当前的商品为蓝,64,则对应的列表为[2,3]
                # 当前商品的选项
                sku_option_temp = sku_option[:]
                # 替换对应索引的元素:规格的索引是固定的,这句代码就是关键! 一次只能更改一个规格选项,从而确定 每个规格选项绑定的商品id
                sku_option_temp[index] = option.id  # 新的列表,代表一个具体新的 sku商品
                # 为选项添加sku_id属性,用于在html中输出链接,这里得选项时 选项对象。因为前后端不分离开发
                option.sku_id = sku_options.get(tuple(sku_option_temp), 0) # 默认值为0
                option_list.append(option)
            spec.option_list = option_list
            specs_list.append(spec)
这样 specs 就被代替为了 specs_list ,因为里面的选项对象,重新添加了 商品id属性

这一部分是最复杂的地方。但是仔细理解,其实也不难,抓住重点。

猜你喜欢

转载自blog.csdn.net/pythonstrat/article/details/108169589