开源web框架django知识总结(十五)

开源web框架django知识总结(十五)

商品数据库表设计

SPU和SKU

在电商中对于商品,有两个重要的概念:SPUSKU

1. SPU介绍

  • SPU = Standard Product Unit (标准产品单位)
    • SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。
    • 通俗的讲,属性值、特性相同的商品就可以归类到一类SPU。
    • 例如:
      • iPhone X 就是一个SPU,与商家、颜色、款式、规格、套餐等都无关。
        开源web框架django知识总结(十五)

2. SKU介绍

  • SKU = Stock Keeping Unit (库存量单位)
    • SKU即库存进出计量的单位,可以是以件、盒等为单位,是物理上不可分割的最小存货单元。
    • 通俗的讲,SKU是指一款商品,每款都有一个SKU,便于电商品牌识别商品。
    • 例如:
      • iPhone X 全网通 黑色 256G 就是一个SKU,表示了具体的规格、颜色等信息。
        开源web框架django知识总结(十五)

思考

SPU和SKU是怎样的对应关系?

  • 一对一?
  • 一对多?

============================

首页广告数据库表分析

1.新建“首页商品(contents)”app,新建子urls.py,同步,注册contents,

开源web框架django知识总结(十五)
2. 首页广告数据库表分析
开源web框架django知识总结(十五)
3. 定义首页广告模型类(contents.models.py)

from django.db import models
from aerf_mall.utils.BaseModel import BaseModel
# Create your models here.


class 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_name

    def __str__(self):
        return self.name


class Content(BaseModel):
    """广告内容表"""

    # 外键, 关联广告类别
    category = models.ForeignKey(ContentCategory,
                                 on_delete=models.PROTECT,
                                 verbose_name='类别')
    # 广告标题
    title = models.CharField(max_length=100,
                             verbose_name='标题')
    # 广告被点击后跳转的 url
    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_name

    def __str__(self):
        return self.category.name + ': ' + self.title

商品信息数据库表分析

1.新建“商品(goods)”app,新建子urls.py,同步,注册goods

开源web框架django知识总结(十五)
2. 商品信息数据库表分析
开源web框架django知识总结(十五)
3. 定义商品信息模型类

from django.db import models

# Create your models here.
from aerf_mall.utils.BaseModel import BaseModel


class GoodsCategory(BaseModel):
    """
    商品分类表对应的内容, 自关联
    """
    # 分类的名称
    name = models.CharField(max_length=10, verbose_name='名称')
    # 分类的上级id (分类一共有三级)
    parent = models.ForeignKey('self',
                               null=True,
                               blank=True,
                               on_delete=models.CASCADE,
                               verbose_name='父类别')

    # 设置分类表的属性
    class Meta:
        db_table = 'tb_goods_category'
        verbose_name = '商品类别'
        verbose_name_plural = verbose_name

    # 返回分类名称
    def __str__(self):
        return self.name


class GoodsChannelGroup(BaseModel):
    """商品频道组"""
    name = models.CharField(max_length=20, verbose_name='频道组名')

    class Meta:
        db_table = 'tb_channel_group'
        verbose_name = '商品频道组'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsChannel(BaseModel):
    """
    商品频道表展示的内容
    """
    # 当前商品频道属于哪个组
    group = models.ForeignKey(GoodsChannelGroup, on_delete=models.CASCADE, verbose_name='组号')
    # 频道对应的一级分类id
    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_name

    def __str__(self):
        return self.category.name


class Brand(BaseModel):
    """
    品牌
    """
    # 品牌名称
    name = models.CharField(max_length=20,
                            verbose_name='名称')
    # 品牌logo
    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_name

    def __str__(self):
        return self.name


class SPU(BaseModel):
    """
    商品SPU表对应的内容: 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='详细介绍', blank=True)
    desc_pack = models.TextField(default='', verbose_name='包装信息', blank=True)
    desc_service = models.TextField(default='', verbose_name='售后服务', blank=True)

    class Meta:
        db_table = 'tb_spu'
        verbose_name = '商品spu'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class SPUSpecification(BaseModel):
    """
    商品规格
    """
    # 这个商品规格属于哪个商品
    spu = models.ForeignKey(SPU,
                            related_name='specs',
                            on_delete=models.CASCADE,
                            verbose_name='商品')
    # 这组规格的名称
    name = models.CharField(max_length=20,
                            verbose_name='规格名称')

    class Meta:
        db_table = 'tb_spu_specification'
        verbose_name = '商品规格'
        verbose_name_plural = verbose_name

    def __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_name

    def __str__(self):
        return '%s - %s' % (self.spec, self.value)


class SKU(BaseModel):
    """
    商品SKU表对应的内容:   SKU: 具体的某个商品
    """

    # specs:隐藏字段,代表从表多条数据对象

    # 这个商品的名称
    name = models.CharField(max_length=50,
                            verbose_name='名称')
    # 这个商品的副标题
    caption = models.CharField(max_length=100,
                               verbose_name='副标题')
    # 这个商品对应 goods 表中的那个字段
    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_url = 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_name

    def __str__(self):
        return '%s: %s' % (self.id, self.name)


class SKUImage(BaseModel):
    """
    SKU图片
    """
    # 这个图片对应哪个 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_name

    def __str__(self):
        return '%s %s' % (self.sku.name, self.id)


class SKUSpecification(BaseModel):
    """
    SKU具体规格
    """
    # 对应的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_name

    def __str__(self):
        return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value)

执行数据迁移:

录入商品数据

mysql -usuifeng -p123456  -D aerf_mall < contents.sql
mysql -usuifeng -p123456  -D aerf_mall < goods.sql

开源web框架django知识总结(十五)

祝大家学习python顺利!

上一篇:Android日志工具使用


下一篇:Django使用Mysql数据库以及自动建表