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

Django中向ManyToMany多对多字段添加数据后返回空查询集

Django多对多字段添加关联后返回空查询集问题解决方案

问题根因

  1. 条件分支逻辑错误:所有订单项创建、多对多字段关联的代码全部放在用户未登录的else分支下,当用户处于登录状态时,这部分逻辑完全不会执行,自然不会产生任何多对多关联数据。
  2. 循环缩进错误:多对多关联代码、订单项关联订单的代码写在遍历menuItems的for循环外部,循环过程中每次都会覆盖orderedMenuItem和customList变量,最终仅会给循环遍历到的最后一个订单项执行关联操作,其余订单项的custom_item_types字段均为空。

修复方法

调整代码缩进层级,将订单项处理逻辑移到登录判断分支之外,同时将关联操作放到for循环内部,保证每个订单项都能执行多对多关联:

if request.user.is_authenticated:
    order = Order.objects.create(
        restaurant=Restaurant.objects.get(code_name=restaurant_code),
        table=Table.objects.get(code_name=request.data['table']),
        customer=request.user
    )
else:
    order = Order.objects.create(
        restaurant=Restaurant.objects.get(code_name=restaurant_code),
        table=Table.objects.get(code_name=request.data['table'])
    )

# 订单项处理逻辑独立,不受登录状态影响
for menuitem in request.data['menuItems']:
    customList = [ItemType.objects.get(id=v) for v in list(menuitem['addOns'])]
    orderedMenuItem = OrderedMenuItem.objects.create(
        quantity=menuitem['quantity'],
        menuitem=MenuItem.objects.get(pk=menuitem['id']),
        remarks=menuitem['remarks']
    )
    # 关联多对多字段放在循环内,每个订单项都执行
    orderedMenuItem.custom_item_types.add(*customList)
    order.ordered_menu_items.add(orderedMenuItem)

# 此处order.save()为非必要操作,Order.objects.create已自动完成实例保存
order.save()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:48:02