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

如何在Django中正确建立食材与菜品的多对多关联并绑定用量?

解决菜品与食材关联时的用量存储问题

在Django里,普通的ManyToManyField没法直接存储关联对象的额外属性(比如这里的食材用量),你需要用**中间模型(through model)**来实现这个需求。

具体修改如下:

from django.db import models

class Ingredient(models.Model):
    name = models.CharField(max_length=30)
    stock_amount = models.IntegerField(verbose_name="库存数量(克)")  # 重命名字段更清晰区分库存和用量

    def __str__(self):
        return self.name

class Dish(models.Model):
    name = models.CharField(max_length=30)
    # 指定中间模型关联食材与对应用量
    ingredients = models.ManyToManyField(Ingredient, through='DishIngredient')

    def __str__(self):
        return self.name

# 中间模型:存储菜品与食材的关联关系及对应用量
class DishIngredient(models.Model):
    dish = models.ForeignKey(Dish, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    required_amount = models.IntegerField(verbose_name="所需用量(克)")

    class Meta:
        # 限制同一菜品的同一种食材只能关联一次
        unique_together = ('dish', 'ingredient')

使用示例

  • 创建菜品并关联食材及用量:
# 先创建食材实例
chicken = Ingredient.objects.create(name="鸡肉", stock_amount=500)
potato = Ingredient.objects.create(name="土豆", stock_amount=1000)

# 创建菜品实例
curry_chicken = Dish.objects.create(name="咖喱鸡")

# 绑定食材与对应用量
DishIngredient.objects.create(dish=curry_chicken, ingredient=chicken, required_amount=100)
DishIngredient.objects.create(dish=curry_chicken, ingredient=potato, required_amount=200)
  • 查询某道菜的所有食材及用量:
curry_chicken = Dish.objects.get(name="咖喱鸡")
for relation in curry_chicken.dishingredient_set.all():
    print(f"{relation.ingredient.name}: {relation.required_amount}克")

这样就能精准为每道菜品关联的食材指定对应用量了。

内容的提问来源于stack exchange,提问作者Nursultan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:20:03