Dave
Dave

Reputation: 1639

How to pass a variable from ModelSerializer.update() to ModelViewSet.update() in Django REST Framework

I need to pass a return value of a custom model update method in the view response.

In my serializer I want to do:

class Serializer(ModelSerializer):
    def update(self, instance, validated_data):
       something_special = validated_data.pop('something_special')

       important_info = model.update_something_special(something_special)

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

       return instance

And now in my view I'd like to return important_info in the response:

class View(ModelViewSet):
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)

        important_info = ???

        return Response(serializer.data)

Is this possible in Django REST or is this a dead end? If so, how to do this differently?

Upvotes: 3

Views: 1615

Answers (1)

Ykh
Ykh

Reputation: 7717

class Serializer(ModelSerializer):
   important_info = None

   def update(self, instance, validated_data):
      something_special = validated_data.pop('something_special')

      self.important_info = model.update_something_special(something_special)

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

      return instance



class View(ModelViewSet):
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        important_info = serializer.important_info 
        return Response(serializer.data)

Upvotes: 6

Related Questions