No Id in the results of the Orderdict although id field is present in the serializers in Django Rest Framework

0 votes

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.




Apr 11, 2021 in Python by anonymous

edited Mar 4, 2025 366 views

No answer to this question. Be the first to respond.

Your answer

Your name to display (optional):
Privacy: Your email address will only be used for sending these notifications.
webinar REGISTER FOR FREE WEBINAR X
REGISTER NOW
webinar_success Thank you for registering Join Edureka Meetup community for 100+ Free Webinars each month JOIN MEETUP GROUP