电商购物系统商品数据结构设置

电商购物系统商品数据结构设置

在这里插入图片描述
如上图所示 , 该表为商品表关系的示意图 , 气质我们要溥仪一个电视购物系统要用到的知识那就是SPU和SKU

简单来说这两种就是不同的分类方式 , 我们在浏览淘宝等页面的时候也会遇见相同的情况如我们可以进行品牌的筛选 , 也可以进行商品价格的筛选 , 这些都是通过SPU和SKU相互关联组成的一个复杂的整体表关系实现的

SPU:标准产品单位 , 表示一组类似属性或者特征的商品集合。【商品的基本信息和属性:名称,描述,品牌】 , 对商品的基本定义SKU:库存单位,表示具体的商品或者库存【商品的规格 , 价格,尺码,版本】

因为博主正在进行Django的项目开发所以这里直接使用Django的ORM框架进行展示 , 代码中有注释 , 我也就不过多赘述

商品首页数据:广告数据表

from django.db import models
from utils.models import BaseModelclass ContentCategory(BaseModel):"""广告内容类别"""name = models.CharField(max_length=50, verbose_name='名称')key = models.CharField(max_length=50, verbose_name='类别键名')class Meta:db_table = 'tb_content_category'verbose_name = '广告内容类别'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass Content(BaseModel):"""广告内容"""category = models.ForeignKey(ContentCategory, on_delete=models.PROTECT, verbose_name='类别')title = models.CharField(max_length=100, verbose_name='标题')url = models.CharField(max_length=300, verbose_name='内容链接')image = models.ImageField(null=True, blank=True, verbose_name='图片')text = models.TextField(null=True, blank=True, verbose_name='内容')sequence = models.IntegerField(verbose_name='排序')status = models.BooleanField(default=True, verbose_name='是否展示')class Meta:db_table = 'tb_content'verbose_name = '广告内容'verbose_name_plural = verbose_namedef __str__(self):return self.category.name + ': ' + self.title

商品数据表关系

from django.db import models
from utils.models import BaseModelclass GoodsCategory(BaseModel):"""商品类别"""name = models.CharField(max_length=10, verbose_name='名称')parent = models.ForeignKey('self', related_name='subs', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父类别')class Meta:db_table = 'tb_goods_category'verbose_name = '商品类别'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass GoodsChannelGroup(BaseModel):"""商品频道组"""name = models.CharField(max_length=20, verbose_name='频道组名')class Meta:db_table = 'tb_channel_group'verbose_name = '商品频道组'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass GoodsChannel(BaseModel):"""商品频道"""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='组内顺序')class Meta:db_table = 'tb_goods_channel'verbose_name = '商品频道'verbose_name_plural = verbose_namedef __str__(self):return self.category.nameclass Brand(BaseModel):"""品牌"""name = models.CharField(max_length=20, verbose_name='名称')logo = models.ImageField(verbose_name='Logo图片')first_letter = models.CharField(max_length=1, verbose_name='品牌首字母')class Meta:db_table = 'tb_brand'verbose_name = '品牌'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass SPU(BaseModel):"""商品SPU"""name = models.CharField(max_length=50, verbose_name='名称')brand = models.ForeignKey(Brand, on_delete=models.PROTECT, verbose_name='品牌')category1 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat1_spu', verbose_name='一级类别')category2 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat2_spu', verbose_name='二级类别')category3 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat3_spu', verbose_name='三级类别')sales = models.IntegerField(default=0, verbose_name='销量')comments = models.IntegerField(default=0, verbose_name='评价数')desc_detail = models.TextField(default='', verbose_name='详细介绍')desc_pack = models.TextField(default='', verbose_name='包装信息')desc_service = models.TextField(default='', verbose_name='售后服务')class Meta:db_table = 'tb_spu'verbose_name = '商品SPU'verbose_name_plural = verbose_namedef __str__(self):return self.nameclass SKU(BaseModel):"""商品SKU"""name = models.CharField(max_length=50, verbose_name='名称')caption = models.CharField(max_length=100, verbose_name='副标题')spu = models.ForeignKey(SPU, on_delete=models.CASCADE, verbose_name='商品')category = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, verbose_name='从属类别')price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='单价')cost_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='进价')market_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='市场价')stock = models.IntegerField(default=0, verbose_name='库存')sales = models.IntegerField(default=0, verbose_name='销量')comments = models.IntegerField(default=0, verbose_name='评价数')is_launched = models.BooleanField(default=True, verbose_name='是否上架销售')default_image = models.ImageField(max_length=200, default='', null=True, blank=True, verbose_name='默认图片')class Meta:db_table = 'tb_sku'verbose_name = '商品SKU'verbose_name_plural = verbose_namedef __str__(self):return '%s: %s' % (self.id, self.name)class SKUImage(BaseModel):"""SKU图片"""sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku')image = models.ImageField(verbose_name='图片')class Meta:db_table = 'tb_sku_image'verbose_name = 'SKU图片'verbose_name_plural = verbose_namedef __str__(self):return '%s %s' % (self.sku.name, self.id)class SPUSpecification(BaseModel):"""商品SPU规格"""spu = models.ForeignKey(SPU, on_delete=models.CASCADE, related_name='specs', verbose_name='商品SPU')name = models.CharField(max_length=20, verbose_name='规格名称')class Meta:db_table = 'tb_spu_specification'verbose_name = '商品SPU规格'verbose_name_plural = verbose_namedef __str__(self):return '%s: %s' % (self.spu.name, self.name)class SpecificationOption(BaseModel):"""规格选项"""spec = models.ForeignKey(SPUSpecification, related_name='options', on_delete=models.CASCADE, verbose_name='规格')value = models.CharField(max_length=20, verbose_name='选项值')class Meta:db_table = 'tb_specification_option'verbose_name = '规格选项'verbose_name_plural = verbose_namedef __str__(self):return '%s - %s' % (self.spec, self.value)class SKUSpecification(BaseModel):"""SKU具体规格"""sku = models.ForeignKey(SKU, related_name='specs', on_delete=models.CASCADE, verbose_name='sku')spec = models.ForeignKey(SPUSpecification, on_delete=models.PROTECT, verbose_name='规格名称')option = models.ForeignKey(SpecificationOption, on_delete=models.PROTECT, verbose_name='规格值')class Meta:db_table = 'tb_sku_specification'verbose_name = 'SKU规格'verbose_name_plural = verbose_namedef __str__(self):return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value)class GoodsVisitCount(BaseModel):"""统计分类商品访问量模型类"""category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='商品分类')count = models.IntegerField(verbose_name='访问量', default=0)date = models.DateField(auto_now_add=True, verbose_name='统计日期')class Meta:db_table = 'tb_goods_visit'verbose_name = '统计分类商品访问量'verbose_name_plural = verbose_name

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3031735.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C# WinForm —— 13 ComboBox下拉框/组合框介绍

1. 简介 ComboBox 是由 textBox 和 listBox 组合而成的,只能选择一项,不能选择多项,其他功能和 listBox类似 ComboBox 下拉框的三种样式:(通过 DropDownStyle属性 设置) Simple: 最简单的样式&#xff0c…

YOLO系列笔记(十四)——Compute Canada计算平台及其常见命令介绍

Compute Canada平台及其常见命令介绍 前言优势使用方法1. 检查模块不带版本号带版本号 2. 加载模块3. 检查模块是否加载成功4. 创建虚拟环境5. 编写作业脚本6. 提交作业7. 监控作业状态8. 查看作业开始预计时间9. 查看作业的详细输出10. 取消作业 注意结语 前言 大家好&#x…

QML 本地存储(Setting,sqlite)

Qt hello - 专注于Qt的技术分享平台 QML 原生的储存方有两种: 1,Settings 跟QWidget 中的QSettings 一样,可以简单的存储一些配置。 2,Sqlite sqlite数据库。可以存储一些复杂的数据。 一,Settings 我们以一个按钮的位…

揭秘微服务架构:十大设计模式助力企业数字化转型

微服务架构中10个常用的设计模式 微服务是一种架构风格,它将一个复杂的应用拆分成多个独立自治的服务,每个服务负责应用程序中的一小部分功能。这些服务通过定义良好的API进行通信,通常是HTTP RESTful API或事件流。微服务架构的主要特点包括…

【SpringSecurity源码】过滤器链加载流程

theme: smartblue highlight: a11y-dark 一、前言及准备 1.1 SpringSecurity过滤器链简单介绍 在Spring Security中,过滤器链(Filter Chain)是由多个过滤器(Filter)组成的,这些过滤器按照一定的顺序对进…

工作中使用Optional处理空指针异常

工作中使用Optional处理空指针异常 实体类以前对空指针的判断Optional处理空指针测试结果 实体类 package po;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;Data AllArgsConstructor NoArgsConstruct…

某大型集团SAP数字化转型方案(95页PPT)

一、资料介绍 《某大型集团SAP数字化转型方案》是一份详尽的95页PPT资料,旨在为某大型集团提供一套全面而深入的SAP数字化转型方案。该方案紧密结合了集团的业务特点和发展需求,以SAP系统为核心,通过数字化技术的运用,实现业务流…

图片格式不对怎么转换?推荐几个图片转换的高效处理方法

在日常使用电脑或处理图片的过程中,我们经常会遇到图片格式不兼容的问题,例如,我们可能收到了一个无法打开的图片文件,或者想将图片转换为其他格式以便在不同的应用程序中使用,这时候就需要将图片转格式,所…

智慧公厕解决了什么问题?

在现代城市生活中,公厕是一个不可忽视的环节。然而,过去的公共厕所常常存在管理不力、环境脏乱差等问题,给人们的生活带来了许多不便和困扰。为了解决这些问题,智慧公厕应运而生,成为了公共厕所使用、运行、管理、养护…

无线收发模块家电控制实验

zkhengyang可申请加入数字音频系统研究开发交流答疑群(课题组) 当然可以先用固定电平发送,可以实现,0/1数据发送,接收。 可以使用51单片机来编码码,解码,或者任何MCU或者SOC,DSP,FPGA。 注意G…

WebSocket基础知识

WebSocket是什么? WebSocket 是一种网络通信协议,它提供了全双工通信机制,允许服务器主动向客户端发送消息,而不仅限于响应客户端的请求。它使用类似于 HTTP 的握手来建立连接,然后使用单独的持久连接来进行通信。这种…

电视剧推荐

1、《春色寄情人》 2、《唐朝诡事录》 3、《南来北往》 4、《与凤行》 5、《利剑玫瑰》 6、《承欢记》

使用nmcli命令在Linux系统上配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)

前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访! 使用nmcli命令在Linux系统上配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)https://myweb.myskillstree.cn/123.html 你是否会…

护眼台灯和普通台灯差别很大吗?专业护眼灯品牌有哪些?

随着科技的不断演进,台灯的设计也日益脱胎换骨,从曾经的笨重造型转变为如今轻盈雅致的外观。它们的功能同样经历了多样化的革新,变得更加人性化和便捷。作为学习、阅读和办公环境中不可或缺的照明工具,台灯所提供的光线舒适度至关…

ChatGLM 本地部署指南(问题解决)

硬件要求(模型推理): INT4 : RTX3090*1,显存24GB,内存32GB,系统盘200GB 如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。 模型微调硬件要求更高。…

【ArcGISProSDK】condition属性

示例 通过caption属性可以看出esri_mapping_openProjectCondition的条件是一个工程被打开 condition的作用 由此可知示例中的Tab实在工程被打开才能使用,否则他禁用显示灰色,在未禁用的时候说明条件满足。 参考文档 insertCondition 元素 (arcgis.com…

擦边宣传、质量堪忧、销量惨淡,创维汽车将何去何从?

文/张诗雨 近日,据多家媒体报道,创维汽车创始人黄宏生在公开场合发言称,创维汽车有助于养生,他在创维汽车里午休,高血压没吃药都恢复正常了。该言论引起网友热议。 针对此事件,5月9日,创维汽车…

Java数组(二)

Java数组(二) 1、多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。二维数组 int a[][] new int[2][5];解析:以上二维数组a可以看成一个两行五列的数组。…

Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King 题面翻译 【题目描述】 佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格,呈 8 8 8\times8 88正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行&#xff…

只需3步,使用Stable Diffusion无限生成AI数字人视频(附安装包)

基本方法 搞一张照片,搞一段语音,合成照片和语音,同时让照片中的人物动起来,特别是头、眼睛和嘴。 语音合成 语音合成的方法很多,也比较成熟了,大家可以选择自己方便的,直接录音也可以&#…