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)