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 4 days ago 13 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