I tried to create an update api for Orders but in the result of the postman, I am getting this error
KeyError at /api/updateorder/260 'id'
I have put the id field both in OrderUpdate Serializer and OrderItemUpdateSerializer as you can see below. Also, I have printed the validated_data.pop('order_items'). In the result of print, I get Orderdict which has no id field. I don't know why id is not showing.
My models:
class Order(models.Model):
ORDER_STATUS = (
('To_Ship', 'To Ship',),
('Shipped', 'Shipped',),
('Delivered', 'Delivered',),
('Cancelled', 'Cancelled',),
)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
order_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')
ordered_date = models.DateTimeField(auto_now_add=True)
ordered = models.BooleanField(default=False)
@property
def total_price(self):
return sum([_.price for _ in self.order_items.all()])
class OrderItem(models.Model):
orderItem_ID = models.CharField(max_length=12, editable=False, default=id_generator)
order = models.ForeignKey(Order,on_delete=models.CASCADE, blank=True,null=True,related_name='order_items')
item = models.ForeignKey(Product, on_delete=models.CASCADE,blank=True, null=True)
order_variants = models.ForeignKey(Variants, on_delete=models.CASCADE,blank=True,null=True)
quantity = models.IntegerField(default=1)
ORDER_STATUS = (
('To_Ship', 'To Ship',),
('Shipped', 'Shipped',),
('Delivered', 'Delivered',),
('Cancelled', 'Cancelled',),
)
order_item_status = models.CharField(max_length=50,choices=ORDER_STATUS,default='To_Ship')
@property
def price(self):
total_item_price = self.quantity * self.order_variants.price
return total_item_price
My serializers:
class OrderItemUpdateSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = OrderItem
fields = ['id','order','item','order_variants', 'quantity','order_item_status','price']
# depth = 1
class OrderUpdateSerializer(serializers.ModelSerializer):
order_items = OrderItemUpdateSerializer(many=True)
billing_details = BillingDetailsSerializer()
class Meta:
model = Order
fields = ['id','ordered','order_status','order_items','total_price','billing_details']
def update(self, instance, validated_data):
instance.order_status = validated_data.get('order_status')
instance.ordered = validated_data.get('ordered')
#billing_details_logic
billing_details_data = validated_data.pop('billing_details',None)
if billing_details_data is not None:
instance.billing_details.address = billing_details_data['address']
instance.billing_details.save()
#order_items_logic
instance.save()
#instance.order_items.clear()
order_items_data = validated_data.pop('order_items')
print(order_items_data)
for order_item_data in order_items_data:
oi, created = OrderItem.objects.update_or_create(
id = order_item_data['id'],
defaults={
'quantity' : order_item_data['quantity'],
'order_item_status': order_item_data['order_item_status'] #
}
)
instance.save()
return super().update(instance,validated_data)
My orderdict after print command.
[OrderedDict([('order', <Order: mylo@gmail.com>), ('item', <Product: AaaAAAAUpdatedpicturetest>), ('order_variants', <Variants: AgainTest>), ('quantity', 3), ('order_item_status', 'To_Ship'
)]), OrderedDict([('order', <Order: mylo@gmail.com>), ('item', <Product: Kiara Terrell>), ('order_variants', <Variants: OAXWadRTZ_12C>), ('quantity', 3), ('order_item_status', 'To_Ship')])]
As we can see, there is no id in the print result. What is the issue? Also, I am not sure if I can use the for loop in the above way for iterating over multiple OrderDict for updating the values.