quantum_stack_interview/shop/models.py

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)