Django中向ManyToMany多对多字段添加数据后返回空查询集
Django多对多字段添加关联后返回空查询集问题解决方案
问题根因
- 条件分支逻辑错误:所有订单项创建、多对多字段关联的代码全部放在用户未登录的
else分支下,当用户处于登录状态时,这部分逻辑完全不会执行,自然不会产生任何多对多关联数据。 - 循环缩进错误:多对多关联代码、订单项关联订单的代码写在遍历
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
相关产品推荐
相关产品推荐

