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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:36:03