D. Make
D. Make

Reputation: 600

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()

Upvotes: 3

Views: 2331

Answers (2)

mrehan
mrehan

Reputation: 1182

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.

Upvotes: 2

neverwalkaloner
neverwalkaloner

Reputation: 47354

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()

Upvotes: 3

Related Questions