Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling Model Method Via Django Rest Framework View

I have a model:

class Size(models.Model):
    size = models.DecimalField(max_digits=5, decimal_places=1)

    def plus_one(self):
        self.size += 1
        self.save()

And I have a simple serializer for this:

class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = '__all__'

How can I call a plus_one model method from my view, using DRF? How is it callable, what is good practice for that? Thanks!

Added:

class SizeAPIView(generics.UpdateAPIView):
    serializer_class = SizeSerializer
    queryset = Size.objects.filter()
like image 692
D. Make Avatar asked Oct 23 '25 16:10

D. Make


2 Answers

If I understood you right you need to call plus_one each time when object updated. In this case you can override perform_update() method like this:

class SizeAPIView(generics.UpdateAPIView):
    serializer_class = SizeSerializer
    queryset = Size.objects.filter()

    def perform_update(self, serializer):
        serializer.save()
        serializer.instance.plus_one()
like image 172
neverwalkaloner Avatar answered Oct 25 '25 14:10

neverwalkaloner


This should be done on serializer level while your SizeAPIView remains unchanged:

class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = '__all__'

    def update(self, instance, validated_data):

        for attr, value in validated_data.items():
            setattr(instance, attr, value)

        instance.plus_one()  # performs `instance.save` too.

Documentation on saving instances.

like image 25
mrehan Avatar answered Oct 25 '25 13:10

mrehan