动态

详情 返回 返回

【Django開發】django美多商某城項目完整開發4.0第12篇:產品部分,數據庫表設計【附代碼文檔】 - 动态 详情

🏆🏆🏆教程全知識點簡介:1.郵件驗證系統包括Django發送郵件、保存郵箱併發送驗證郵件、Celery使用Django配置文件設置。2. 地址管理涵蓋shou貨地址、省市區地址查詢、數據庫建表、後端接口設計、前端實現、緩存使用(安裝、使用方法、省市區視圖緩存、緩存數據保存位置和有效期設置)、用户地址管理。3. 數據庫設計包括用户部分、產品部分、數據庫表設計、表結構、數據庫模型類。4. 容器化部署涵蓋Docker使用(Ubuntu安裝、啓動停止、鏡像操作)、FastDFS客户端與自定義文件存儲系統、頁面靜態化、定時任務、靜態化首頁腳本。5. 產品系統包括產品詳情頁、異步任務觸發、腳本工具、用户瀏覽歷史記錄(保存、查看)。6. 產品模式涵蓋B2B企業對企業、C2C個人對個人、O2O線上到線下、開發流程、需求分析。7. 購wu車系統包括購wu車管理、購wu車數據存儲設計(Redis保存已登錄用户)、添加到購wu車、查詢購wu車數據、登錄合併購wu車。8. 訂order單系統涵蓋提交訂order單、我的訂order單、訂order單評價、訂order單結算、保存訂order單、MySQL事務隔離級別修改、下單成功頁面。9. 搜索系統包括產品搜索、搜索引擎原理、Elasticsearch、Docker安裝Elasticsearch擴展、前端實現。10. 支fu系統涉及 集成、Xadmin管理後台。11. 項目配置包括項目準備、配置文件修改、數據庫配置、Redis配置、本地化語言時區、異常處理、日誌記錄。12. 用户認證系統涵蓋圖片驗證碼、域名設置、前端Vue代碼、跨域CORS、Celery發送短信、賬號存在判斷、JWT認證(JWT概念、構成、應用、Django REST framework JWT)、 登錄(登錄流程、模型類創建、urllib使用、回調處理)、用户中心個人信息。

<!-- start:bj1 -->

📚📚倉庫code.zip 👉直接-->:   https://gitlab.com/yinuo_112/Backend/-/blob/main/Django/djang...    🍅🍅

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

產品部分

數據庫表設計

在電商中對於產品,有兩個重要的概念:SPUSKU

  • SPU = Standard Product Unit (標準產品單位)

SPU是產品信息聚合的最小單位,是一組可服用、易檢索的標準化信息的集合,該集合描述了一個產品的特性。

通俗的講,屬性值、特性相同的產品就可以稱為一個SPU。

例如:

iPhone X 就是一個SPU,與商家、顏色、款式、規格、套餐等都無關。

  • SKU = Stock Keeping Unit (庫存量單位)

SKU即庫存進出計量的單位,可以是以件、盒、托盤等為單位,是物理上不可分割的最小存貨單元。在使用時要根據不同業態,不同管理模式來處理。在服裝、鞋類產品中使用最多最普遍。

例如:

iPhone X 全網通黑色256G 就是一個SKU,表示了具體的規格、顏色等信息。

表結構

產品數據表結構

首頁ad數據表結構

數據庫模型類

創建產品應用goods,產品數據模型類

passlib 文檔

Click 文檔

class GoodsCategory(BaseModel):
    """
    產品類別
    """
    name = models.CharField(max_length=10, verbose_name='名稱')
    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 GoodsChannel(BaseModel):
    """
    產品頻道
    """
    group_id = models.IntegerField(verbose_name='組號')
    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 = 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 Goods(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_goods', verbose_name='一級類別')
    category2 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat2_goods', verbose_name='二級類別')
    category3 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat3_goods', verbose_name='三級類別')
    sales = models.IntegerField(default=0, verbose_name='銷量')
    comments = models.IntegerField(default=0, verbose_name='評價數')

    class Meta:
        db_table = 'tb_goods'
        verbose_name = '產品'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsSpecification(BaseModel):
    """
    產品規格
    """
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name='產品')
    name = models.CharField(max_length=20, verbose_name='規格名稱')

    class Meta:
        db_table = 'tb_goods_specification'
        verbose_name = '產品規格'
        verbose_name_plural = verbose_name

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


class SpecificationOption(BaseModel):
    """
    規格選項
    """
    spec = models.ForeignKey(GoodsSpecification, 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
    """
    name = models.CharField(max_length=50, verbose_name='名稱')
    caption = models.CharField(max_length=100, verbose_name='副標題')
    goods = models.ForeignKey(Goods, 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.CharField(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 = 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 = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku')
    spec = models.ForeignKey(GoodsSpecification, 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)

jsonschema 文檔

創建ad內容應用contents,ad數據模型類

aioredis 文檔

class ContentCategory(BaseModel):
    """
    ad內容類別
    """
    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 = 'ad內容類別'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Content(BaseModel):
    """
    ad內容
    """
    category = models.ForeignKey(ContentCategory, on_delete=models.PROTECT, verbose_name='類別')
user avatar xzqcsj 头像 aqiongbei 头像 leexiaohui1997 头像 haixiudezhusun 头像 beckyyyy 头像 puxiaoke6 头像 potato1314 头像 bao_686ce718ec240 头像 wbccb 头像 ruizhengyun 头像 chunzhendexiaogou 头像 fanudeqianbao 头像
点赞 21 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.