Ошибка при выполнении POST-запроса к API django

From post man, Я пытаюсь сделать POST запрос к API заказа, созданного с помощью django restframework, но получаю следующую ошибку:

 product = Product.objects.get(id=i['product'])
TypeError: string indices must be integers

Конкретная точка, в которой находится ошибка, указана в ошибке, но я испытываю трудности с построением VALID json для тела запроса. Вот как я делаю запрос на postman:

{
    "orderItems":{
        "product": {"name":"abc", "brand":"def", "image"www.example.com/img", "description":"xyz", "price":"50"},
        "qty":"2",
        "price":"200"
    },
    "shippingAddress": {
        "address":"abc", "city":"B", "postalCode":"12345",
    },
    
    "paymentMethod":"monify",
    "itemPrice":"100"
}

Вот программа:

class Product(models.Model):
    category = models.CharField(max_length=50, choices=Categories.choices, default=Categories.medications)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name="user_product", null=True)
    name = models.CharField(max_length=150)
    brand = models.CharField(max_length=255, default="brand")
    productClass = models.CharField(max_length=50, null=True, blank=True)
    image = models.ImageField(upload_to="images/products/")
    label = models.CharField(max_length=254, default='', blank=True, null=True)
    price = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
    stock = models.IntegerField(null=True, blank=True, default=0)
    dateCreated = models.DateTimeField(auto_now_add=True)


class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name="user_order", null=True)
    paymentMethod = models.CharField(max_length=200, null=True, blank=True)
    dateCreated = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.dateCreated)

models.py
class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    image = models.CharField(max_length=200, null=True, blank=True)
    order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
    name = models.CharField(max_length=200, null=True, blank=True)
    qty = models.IntegerField(null=True, blank=True, default=0)
    price = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)

    def __str__(self):
        return str(self.name)

Представление, которое я пытаюсь протестировать, показано ниже:

def addOrderItems(request):
    user = request.user
    data = request.data

    orderItems = data['orderItems']

    if orderItems and len(orderItems) == 0:
        return Response({'detail': 'Order item was not provided'}, status=status.HTTP_400_BAD_REQUEST)
    else:

        # Step 1: Create order

        order = Order.objects.create(
            user=user,
            paymentMethod=data['paymentMethod'],
        )

        #Step 2: Create shipping address

        shipping = ShippingAddress.objects.create(
            order=order,
            address=data['shippingAddress']['address'],
        )

        # Step 3: Create order items, then set order to orderItem relationship
        for i in orderItems:
            product = Product.objects.get(id=i['product'])

            item = OrderItem.objects.create(
                product=product,
                order=order,
                name=product.name,
                qty=i['qty'],
                price=i['price'],
                image=product.image.url,
            )

            # Step 4: Update stock
            product.countInStock -= item.qty
            product.save()

        serializer = OrderSerializer(order, many=False)
        return Response(serializer.data)

Любая подсказка по этому вопросу будет высоко оценена

Ваш JSON недействителен (ключ "image" в "orderItems" был перепутан). Чтобы проверить это, вы можете использовать онлайн-инструмент, например https://jsonformatter.curiousconcept.com/.

Вот исправленный JSON:

{
    "orderItems":{
        "product": {"name":"abc", "brand":"def", "image": "www.example.com/img", "description":"xyz", "price":"50"},
        "qty":"2",
        "price":"200"
    },
    "shippingAddress": {
        "address":"abc", "city":"B", "postalCode":"12345",
    },
    
    "paymentMethod":"monify",
    "itemPrice":"100"
}

Я думаю, что полезная нагрузка не верна. Теперь все данные о товаре загружены, но их нужно изменить на product_id. Потому что в представлении он рассматривается как поле id, как Product.objects.get(id=i['product']).

Итак, решение заключается в следующем. Во-первых, необходимо изменить полезную нагрузку.

{
    "orderItems":{
        "product_id": 3,  // here I changed 
        "qty":"2",
        "price":"200"
    },
    "shippingAddress": {
        "address":"abc", "city":"B", "postalCode":"12345",
    },
    
    "paymentMethod":"monify",
    "itemPrice":"100"
}

В функции addOrderItems,

def addOrderItems(request):
    ...
    if orderItems and len(orderItems) == 0:
        ...
    else:
        ...
        
        # Step 3: Create order items, then set order to orderItem relationship
        for i in orderItems:
            product = Product.objects.get(id=i['product_id'])
            ...
Вернуться на верх