天天看點

Python項目-Django-建立訂單資料庫表

建立訂單資料庫表

生成的訂單資料要做持久化處理,而且需要在《我的訂單》頁面展示出來。

訂單資料庫表分析

訂單号不再采用資料庫自增主鍵,而是由後端生成。

一個訂單中可以有多個商品資訊,訂單基本資訊和訂單商品資訊是一對多的關系。

Python項目-Django-建立訂單資料庫表
Python項目-Django-建立訂單資料庫表

訂單模型類遷移建表

orders/ models.py

from django.db import models
from utils.models import BaseModel
from users.models import User, Address
from goods.models import SKU


class OrderInfo(BaseModel):
    """訂單資訊"""
    PAY_METHODS_ENUM = {
        "CASH": 1,
        "ALIPAY": 2
    }
    PAY_METHOD_CHOICES = (
        (1, "貨到付款"),
        (2, "支付寶"),
    )
    ORDER_STATUS_ENUM = {
        "UNPAID": 1,
        "UNSEND": 2,
        "UNRECEIVED": 3,
        "UNCOMMENT": 4,
        "FINISHED": 5
    }
    ORDER_STATUS_CHOICES = (
        (1, "待支付"),
        (2, "待發貨"),
        (3, "待收貨"),
        (4, "待評價"),
        (5, "已完成"),
        (6, "已取消"),
    )
    order_id = models.CharField(max_length=64, primary_key=True, verbose_name="訂單号")
    user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name="下單使用者")
    address = models.ForeignKey(Address, on_delete=models.PROTECT, verbose_name="收貨位址")
    total_count = models.IntegerField(default=1, verbose_name="商品總數")
    total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品總金額")
    freight = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="運費")
    pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=1, verbose_name="支付方式")
    status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name="訂單狀态")
    class Meta:
        db_table = "tb_order_info"
        verbose_name = '訂單基本資訊'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.order_id
class OrderGoods(BaseModel):
    """訂單商品"""
    SCORE_CHOICES = (
        (0, '0分'),
        (1, '20分'),
        (2, '40分'),
        (3, '60分'),
        (4, '80分'),
        (5, '100分'),
    )
    order = models.ForeignKey(OrderInfo, related_name='skus', on_delete=models.CASCADE, verbose_name="訂單")
    sku = models.ForeignKey(SKU, on_delete=models.PROTECT, verbose_name="訂單商品")
    count = models.IntegerField(default=1, verbose_name="數量")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="單價")
    comment = models.TextField(default="", verbose_name="評價資訊")
    score = models.SmallIntegerField(choices=SCORE_CHOICES, default=5, verbose_name='滿意度評分')
    is_anonymous = models.BooleanField(default=False, verbose_name='是否匿名評價')
    is_commented = models.BooleanField(default=False, verbose_name='是否評價了')
    class Meta:
        db_table = "tb_order_goods"
        verbose_name = '訂單商品'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.sku.name