如何根据列表中字典的数量创建多个OrderItem?Django订单项生成数量异常问题求助
问题分析与修复方案
嘿,我一眼就看到问题出在哪了——你处理请求数据的方式完全搞错了方向,导致循环次数和取值都不对!
核心错误点
你这段代码里的orderitemslist生成逻辑是把所有字典的所有值都扁平化拆成了一个一维列表:
orderitemslist = [int(v) for lst in data for k,v in lst.items()]
你的data是3个字典,每个字典有3个键值对,所以这个推导式会生成一个包含9个元素的列表(3*3)。然后你又循环这个9元素的列表,每次创建一个OrderItem,自然就生成了9条数据,而不是你期望的3条。
更糟的是,你取quantity、service_id、price的方式也错了:
quantity = orderitemslist[1] service_id = orderitemslist[2] price = orderitemslist[3]
这几个变量只取了列表前几个元素的值(也就是第一个字典的三个值),所以哪怕循环9次,每次存入数据库的都是同一组数据,完全没用到后面字典的内容。
修复后的代码
你应该直接遍历data里的每个字典,从每个字典中提取对应的字段值,然后创建OrderItem。修改后的视图函数如下:
from datetime import datetime import json from django.http import Response from django.views.decorators.csrf import csrf_exempt from rest_framework.decorators import api_view from .models import Order, OrderItem @api_view(['GET', 'POST']) @csrf_exempt def create_order(request, *args, **kwargs): if request.method == 'POST': now = datetime.date.today() # create方法已经自动保存,不需要额外调用save() order = Order.objects.create(date=now) order_id = order.id data = json.loads(request.body) # 直接遍历data中的每个字典 for item_dict in data: # 从每个字典中提取对应字段 quantity = item_dict['quantity'] service_id = item_dict['service_id'] price = item_dict['price'] # create方法自动保存,无需save() OrderItem.objects.create( order_id_id=order_id, quantity=quantity, service_id_id=service_id, price=price ) return Response({"message": "data created"}) else: order_qs = Order.objects.all().values_list() order_item_qs = OrderItem.objects.all().values_list() return Response({"Order": str(order_qs),"OrderItem": str(order_item_qs)})
额外优化提示
- 去掉多余的
save()调用:Django的objects.create()方法已经会自动把实例保存到数据库,所以order.save()和orderitemcreate.save()都是完全没必要的,可以删掉。 - 字段命名更规范:比如
order_id_id其实可以直接用order=order(如果模型里的外键字段是order = models.ForeignKey(Order, ...),直接传入order实例更清晰),同理service_id_id可以改成service_id=service_id(对应模型中外键service = models.ForeignKey(Service, ...)的话)。 - 添加数据验证:可以检查
data中的每个字典是否包含quantity、service_id、price这些必需键,避免因请求数据缺失导致报错。
内容的提问来源于stack exchange,提问作者munshi
相关产品推荐
相关产品推荐

