Как создать несколько элементов заказа в зависимости от количества словарей в списке?

Эти данные я отправляю через секцию 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

Вернуться на верх