from django.db import models class DishCategory(models.Model): """菜品分类""" name = models.CharField(max_length=50, unique=True, verbose_name="分类名称") icon = models.CharField(max_length=50, blank=True, verbose_name="图标类名") order = models.IntegerField(default=0, verbose_name="排序") class Meta: verbose_name = "菜品分类" verbose_name_plural = "菜品分类" ordering = ['order', 'id'] def __str__(self): return self.name class Dish(models.Model): """菜品""" name = models.CharField(max_length=100, verbose_name="菜品名称") category = models.ForeignKey(DishCategory, on_delete=models.SET_NULL, null=True, blank=True, related_name='dishes', verbose_name="分类", db_index=True) cover_image = models.CharField(max_length=500, blank=True, null=True, verbose_name="封面图URL") description = models.TextField(blank=True, verbose_name="做法描述(Markdown格式)") ingredients = models.JSONField(default=list, verbose_name="材料清单") view_count = models.IntegerField(default=0, verbose_name="浏览次数") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") class Meta: verbose_name = "菜品" verbose_name_plural = "菜品" ordering = ['-created_at'] indexes = [ models.Index(fields=['name']), models.Index(fields=['-created_at']), ] def __str__(self): return self.name class Order(models.Model): """订单""" STATUS_CHOICES = [ ('in_progress', '进行中'), ('completed', '已完成'), ] name = models.CharField(max_length=100, verbose_name="订单名称") dishes = models.ManyToManyField(Dish, related_name='orders', verbose_name="菜品") status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='in_progress', verbose_name="状态") party_date = models.DateTimeField(null=True, blank=True, verbose_name="聚会时间", db_index=True) participants = models.JSONField(default=list, verbose_name="参与人员") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") completed_at = models.DateTimeField(null=True, blank=True, verbose_name="完成时间") note = models.TextField(blank=True, verbose_name="备注") images = models.JSONField(default=list, verbose_name="聚会照片") class Meta: verbose_name = "订单" verbose_name_plural = "订单" ordering = ['-created_at'] indexes = [ models.Index(fields=['status', '-created_at']), models.Index(fields=['party_date']), ] def __str__(self): return self.name def get_ingredients_summary(self): """汇总所有菜品需要的材料""" summary = {} for dish in self.dishes.all(): for ing in dish.ingredients: name = ing.get('name', '').strip() amount = ing.get('amount', '').strip() if name: if name in summary: if amount: summary[name] += f" + {amount}" else: summary[name] = amount return [{'name': k, 'amount': v} for k, v in summary.items()]