You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型中如何配置菜品类的多食材关联字段?

Django菜品模型关联多数量食材的字段设置方案

菜品和食材属于多对多关系:一道菜可使用多种食材,一种食材也能用于制作多道菜品。根据是否需要存储关联的额外信息,有两种实现方案:

方案一:无额外关联信息的基础多对多关联

如果只需要记录菜品用到哪些食材,不需要用量、单位这类额外数据,直接使用ManyToManyField即可,Django会自动生成中间表维护两者的关联关系:

class DishClass(models.Model):
    name = models.CharField('Name', max_length=50, default='')
    price = models.FloatField()
    # 直接关联食材模型
    ingredients = models.ManyToManyField(IngredientsClass)

使用示例:

# 给菜品添加食材
dish = DishClass.objects.get(name="宫保鸡丁")
ingredient = IngredientsClass.objects.get(name="花生")
dish.ingredients.add(ingredient)

# 获取菜品的所有食材
dish_ingredients = dish.ingredients.all()

方案二:含额外关联信息的自定义中间表

如果需要记录每种食材在菜品中的具体用量、单位等信息,需要自定义中间模型,并通过through参数指定:

1. 定义中间关联模型

class DishIngredient(models.Model):
    dish = models.ForeignKey(DishClass, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(IngredientsClass, on_delete=models.CASCADE)
    quantity = models.FloatField(verbose_name="食材用量")
    unit = models.CharField(max_length=20, verbose_name="单位", default="g")

    # 可选:设置联合唯一约束,避免同一食材重复关联同一菜品
    class Meta:
        unique_together = ('dish', 'ingredient')

2. 修改菜品模型的关联字段

class DishClass(models.Model):
    name = models.CharField('Name', max_length=50, default='')
    price = models.FloatField()
    # 通过自定义中间表关联食材
    ingredients = models.ManyToManyField(IngredientsClass, through=DishIngredient)

使用示例:

# 创建带用量的食材关联
dish = DishClass.objects.get(name="宫保鸡丁")
ingredient = IngredientsClass.objects.get(name="鸡肉")
DishIngredient.objects.create(
    dish=dish,
    ingredient=ingredient,
    quantity=200,
    unit="g"
)

# 获取菜品的食材及对应用量
dish_ingredients = DishIngredient.objects.filter(dish=dish)
for item in dish_ingredients:
    print(f"{item.ingredient.name}: {item.quantity}{item.unit}")

额外建议

模型类名建议遵循Django的命名规范,使用单数形式,比如将IngredientsClass改为Ingredient,DishClass改为Dish,更符合行业惯例。

内容的提问来源于stack exchange,提问作者Tim-Tam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:40:01