Как создать несколько элементов заказа в зависимости от количества словарей в списке?
Эти данные я отправляю через секцию postman raw(json). И data = json.loads(request.body) и следующие данные такие же
data = [{'quantity': 2, 'service_id': 1, 'price': 2}, {'quantity': 2, 'service_id': 1, 'price': 2}, {'quantity': 2, 'service_id': 1, 'price': 2}]
@api_view(['GET', 'POST'])
@csrf_exempt
def create_order(request, *args, **kwargs):
if request.method == 'POST':
now = datetime.date.today()
order = Order.objects.create(date=now)
order.save()
orderid = order.id
order_id = orderid
data = json.loads(request.body)
orderitemslist = [int(v) for lst in data for k,v in lst.items()]
quantity = orderitemslist[1]
service_id = orderitemslist[2]
price = orderitemslist[3]
for item in orderitemslist:
orderitemcreate= OrderItem.objects.create(order_id_id=order_id,
quantity=quantity,
service_id_id=service_id,
price=price)
orderitemcreate.save()
return Response({"data created"})
else:
order_qs = models.Order.objects.all().values_list()
OrderItem_qs = models.OrderItem.objects.all().values_list()
return Response({"Order":str(order_qs),"OrderItem":str(OrderItem_qs)})
Я хочу хранить данные в db, как если бы в списке было три [{'quantity': 2, 'service_id': 1, 'price': 2}, {'quantity': 2, 'service_id': 1, 'price': 2}, {'quantity': 2, 'service_id': 1, 'price': 2}]
словаря. Цикл должен создать 3 Orderitem и сохранить каждое значение в таблице. Но он создает 9 Orderitem, потому что есть 9 colum (1 dict имеет 3 col) 3 dicts = 9 cols .Кто-нибудь может сказать, где я ошибаюсь?
Вы выполняете двойную итерацию:
orderitemslist = [int(v) for lst in data for k,v in lst.items()]
. Потому что вы получаете 9 элементов заказа.
Вы должны итерировать ваши data
.
Следующий фрагмент должен работать:
@api_view(['GET', 'POST'])
@csrf_exempt
def create_order(request, *args, **kwargs):
if request.method == 'POST':
now = datetime.date.today()
order = Order.objects.create(date=now)
order.save()
data = json.loads(request.body)
for item in data:
OrderItem.objects.create(
order_id_id=order.id,
quantity=item.get("quantity"),
service_id_id=item.get("service_id"),
price=item.get("price")
)
return Response({"data created"})
else:
order_qs = models.Order.objects.all().values_list()
OrderItem_qs = models.OrderItem.objects.all().values_list()
return Response({"Order":str(order_qs),"OrderItem":str(OrderItem_qs)})
Также create()
методом является создание объекта и сохранение всего в один шаг. Посмотрите на Django Docs