Django中如何通过Order模型的ManyToMany关联获取餐厅邮箱
解决方案
你当前视图代码的直接修正
你在itertools.groupby的循环里已经拿到了当前分组对应的Restaurant实例变量restaurant,直接取它的email属性即可。同时你的cooking_meal_notification方法还需要传入餐品参数,你可以从当前分组的餐品里取信息,示例代码如下:
# 原有创建Order、绑定cart_meal的逻辑不动 order.cart_meal.set([cart_meal for cart_meal in cart_meals]) # 拼接餐品信息,可根据你的业务需求调整格式 meal_list = [cart_meal.meal.name for cart_meal in cart_meals] meal_info = "\n".join(meal_list) # 直接用循环拿到的restaurant实例取邮箱 cooking_meal_notification(restaurant_email=restaurant.email, meal=meal_info)
通用场景:从任意Order实例获取餐厅邮箱
你之前的写法错误原因是:cart_meal是多对多字段,直接访问.model拿到的是CartMeal的模型类,不是关联的具体实例数据。
正确的取值逻辑是先从多对多字段拿到关联的CartMeal实例集合,再逐层向下关联取值:
# 1. 拿到Order关联的所有CartMeal实例 cart_meals = order.cart_meal.all() # 2. 因为你是按餐厅分组生成的Order,同一个Order下所有餐品都属于同一个餐厅,取第一个即可 if cart_meals.exists(): restaurant_email = cart_meals.first().meal.restaurant.email
如果后续业务逻辑调整为一个Order可以对应多个餐厅,遍历取值即可:
restaurant_emails = [cart_meal.meal.restaurant.email for cart_meal in order.cart_meal.all()] # 需要去重的话可以转成集合再转回列表 unique_emails = list(set(restaurant_emails))
内容的提问来源于stack exchange,提问作者nikitaex
相关产品推荐
相关产品推荐

