60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
from enum import Enum
|
|
from typing import ClassVar
|
|
|
|
from django.db import models
|
|
|
|
|
|
class OrderStatus(Enum):
|
|
PENDING = "pending"
|
|
SUCCESS = "success"
|
|
FAILED = "failed"
|
|
|
|
@classmethod
|
|
def choices(cls):
|
|
return [(tag.name, tag.value) for tag in cls]
|
|
|
|
|
|
class Product(models.Model):
|
|
"""
|
|
商品模型
|
|
"""
|
|
|
|
id = models.AutoField(verbose_name="商品ID", primary_key=True)
|
|
name = models.CharField(verbose_name="商品名称", max_length=255, db_index=True)
|
|
description = models.TextField(verbose_name="商品描述", blank=True)
|
|
price = models.DecimalField(verbose_name="商品价格", max_digits=10, decimal_places=2)
|
|
stock = models.PositiveIntegerField(verbose_name="商品库存", default=0)
|
|
keywords = models.CharField(verbose_name="商品关键词", max_length=255, blank=True)
|
|
updated_at = models.DateTimeField(verbose_name="更新时间", auto_now=True)
|
|
|
|
class Meta:
|
|
verbose_name = "商品"
|
|
indexes: ClassVar[list[models.Index]] = [
|
|
models.Index(fields=["name"], name="idx_product_name"),
|
|
models.Index(fields=["keywords"], name="idx_product_keywords"),
|
|
]
|
|
|
|
|
|
class Order(models.Model):
|
|
"""
|
|
订单模型
|
|
"""
|
|
|
|
created_at = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
|
|
status = models.CharField(verbose_name="订单状态", max_length=32, default=OrderStatus.PENDING.value)
|
|
|
|
|
|
class OrderItem(models.Model):
|
|
"""
|
|
订单项模型
|
|
"""
|
|
|
|
order = models.ForeignKey(Order, related_name="items", on_delete=models.CASCADE)
|
|
product = models.ForeignKey(Product, on_delete=models.PROTECT)
|
|
quantity = models.PositiveIntegerField(verbose_name="数量")
|
|
price = models.DecimalField(verbose_name="价格", max_digits=10, decimal_places=2)
|
|
status = models.CharField(verbose_name="订单项状态", max_length=32, default=OrderStatus.SUCCESS.value)
|
|
fail_reason = models.CharField(verbose_name="失败原因", max_length=255, blank=True)
|