Home > Software design >  Why is PUT request not updating the Django rest framework database?
Why is PUT request not updating the Django rest framework database?

Time:08-01

I am trying to update the database using a PUT request. Currently, I am able to update the database from the Django Admin successfully but I want to do same using a PUT request.

When ever I make a PUT request, I get a 200 OK response with no errors but the data is not updating in the database. I dont know why. I am confused. Someone please help me. Thank you.

models.py

class User_Order(models.Model):
    order = models.OneToOneField(Orders, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    id = models.IntegerField(primary_key=True)
    shirts = models.IntegerField(default=0)
    shorts = models.IntegerField(default=0)
    trousers = models.IntegerField(default=0)

    total_units = models.CharField(max_length=2000, blank=True)
    
    shirts_amount = models.CharField(max_length=2000, blank=True)
    shorts_amount = models.CharField(max_length=2000, blank=True)
    trousers_amount = models.CharField(max_length=2000, blank=True)
    
    total = models.CharField(max_length=200,blank=True)
    
    

    verified = models.BooleanField(null=True)
    doing_laundry = models.BooleanField(null=True)
    delivery_underway = models.BooleanField(null=True)
    delivered = models.BooleanField(null=True)

    address = models.TextField(default='')

    time = models.DateTimeField(auto_now=True)
    
    
    def save(self, *args, **kwargs):
        self.user = self.order.user
        self.id = self.order.id
        self.shirts = self.order.shirts
        self.shorts = self.order.shorts
        self.trousers = self.order.trousers
        self.total_units = self.order.total_units
        self.shirts_amount = self.order.shirts_amount
        self.shorts_amount = self.order.shorts_amount
        self.trousers_amount = self.order.trousers_amount
        self.total = self.order.total
        self.verified = self.order.verified
        self.doing_laundry = self.order.doing_laundry
        self.delivery_underway = self.order.delivery_underway
        self.delivered = self.order.delivered
        self.address = self.order.address

        super().save(*args, **kwargs)

    def __str__(self):
        return f'{self.order.user.username} Order'

serializers.py

class UserUser_OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = User_Order
        fields = '__all__'

views.py

@api_view(['PUT'])
def UserOrdersUpdate(request, pk):
    permission_classes = [IsAuthenticated]
    user_order = User_Order.objects.get(id=pk)
    if request.method == 'PUT':

        serializer = UserUser_OrderSerializer(instance=user_order, data=request.data, many = False, partial=True)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)

CodePudding user response:

Maybe it's because in User_Order.save() method you replace all fields from User_Order where all the data from serializer is stored with Order instance values.

Also you can use class based view UpdateAPIView to simplify it:

class UserOrdersUpdateView(generics.ListCreateAPIView):
    queryset = User_Order.objects.all()
    serializer_class = UserUser_OrderSerializer
    permission_classes = [IsAuthenticated]

Docs:

UpdateAPIView

Used for update-only endpoints for a single model instance. Provides put and patch method handlers. Extends: GenericAPIView, UpdateModelMixin.

  • Related