电商购物系统商品数据结构设置 -- 商品类别表

商品分类

该项目是一个连续完整的项目 , 如果看不懂可以去看看专栏中先前的博文
在这里插入图片描述

如上图对商品的一个分类实际上和省市区的分类十分类似 , 都是通过自关联的方法来实现 , 但是这里不同的是 , 涉及到外键来获取数据

首先让我们来看一下最后通过后端返回数据的形式是什么样子的

"""
        {
            1:{
                channels:[
                    {id:1 , name:手机 , url:},
                    {}
                    {}
                ],
                sub_cats:[
                    {id:500
                    name:手机通讯,
                    sub_cat:[
                        {id:520 , name:华为},
                        {},……
                    ]},
                    {}……
                ]
            },
            2:{},
            3:{},
            ……
            }
        """

也就是说我们需要设置一个大的字典 , 其中第一个键也就是上述的1 , 2 , 3… 这是所有类别的数目 , 也就是下图所展示的部分 , 如id为1所对应的数据保存在channels中的name元素也就是手机相册数码

**在这里插入图片描述
**

在我们打开第一个后会展示如下图的页面其中红色框出的就是第二类元素我们将其放在sub_cats这个列表中

在这里插入图片描述

现在的逻辑就很清楚了 , 在这之后我们再嵌套一个列表用来保存第二类数据的子类数据

介绍完之后我们要进行第二步进行实操了

  1. 首先我们要通过channels = GoodsChannel.objects.all()获得商品分组频道的所有数据 , 然后进行循环 , 因为我们使用的是一个自关联的方法所以在拿到第一级数据的时候它的id会重复 – 第一级数据中会包含很多子数据如手机 , 相册 , 数码 , 他们的分组id设置的是相同的

     categories = {}
            # 查询商品分组频道的所有数据
            channels = GoodsChannel.objects.all()
            for channel in channels:
                        group_id = channel.group_id
                        if group_id not in categories:
                            categories[group_id] = {'channels': [], 'sub_cats': []}
    
  2. 在设置好第一级模版之后 , 我们再添加channels中的数据

     # 获得 第一级 主键的数据 , 通过第一级主键获得该类目下的分类
                category = channel.category
                categories[group_id]['channels'].append(
                    {
                        'id' : category.id,
                        'name' : category.name,
                        'url' : channel.url
                    }
                )
    
  3. 在获取第二级第三级数据和之前有一点不相同

    	group = models.ForeignKey(GoodsChannelGroup, verbose_name='频道组名', on_delete=models.CASCADE)
        category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='顶级商品类别')
        url = models.CharField(max_length=50, verbose_name='频道页面链接')
        sequence = models.IntegerField(verbose_name='组内顺序')
    

    在商品频道组数据库设置的过程中我们是绑定了两个外键字段category,group

    category是一个自关联的表格 , 通过这个表格我们可以获取到所有的数据

    # subs通过父类别访问子类别 category 该表格设置的是一个自关联的方法 , 通过父类id获得获得表内子类数据
                category1 = category.subs.all()
                for re_category in category1:
                    sub_cat = []
                    categories[group_id]['sub_cats'].append(
                        {
                            'id': re_category.id,
                            'name': re_category.name,
                            'sub_cat' : sub_cat
                        }
                    )
                    category2 = re_category.subs.all()
                    for sub_category in category2:
                        sub_cat.append(
                            {
                                'id': sub_category.id,
                                'name': sub_category.name,
    
                            }
                        )
            context = {'categories':categories}
    
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值