如何在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
相关产品推荐
相关产品推荐

