Ошибка при выполнении 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'])
...