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

