From 83ed1f8fea28ed60405c0b93f43e5ff857448421 Mon Sep 17 00:00:00 2001 From: Danilo Reinert Date: Fri, 14 May 2021 19:55:37 -0300 Subject: [PATCH] ModelSerializer perform_create and perform_update The ModelSerializer function should expose two simple methods intended to be overridden by users if they only want to customize the Model saving call when creating and updating the instance. --- rest_framework/serializers.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 49eec8259..c2dd14ec9 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -936,7 +936,7 @@ class ModelSerializer(Serializer): many_to_many[field_name] = validated_data.pop(field_name) try: - instance = ModelClass._default_manager.create(**validated_data) + instance = perform_create(ModelClass, validated_data) except TypeError: tb = traceback.format_exc() msg = ( @@ -964,6 +964,9 @@ class ModelSerializer(Serializer): field.set(value) return instance + + def perform_create(ModelClass, validated_data): + return ModelClass._default_manager.create(**validated_data) def update(self, instance, validated_data): raise_errors_on_nested_writes('update', self, validated_data) @@ -980,7 +983,7 @@ class ModelSerializer(Serializer): else: setattr(instance, attr, value) - instance.save() + perform_update(instance) # Note that many-to-many fields are set after updating instance. # Setting m2m fields triggers signals which could potentially change @@ -991,6 +994,9 @@ class ModelSerializer(Serializer): return instance + def perform_update(instance): + instance.save() + # Determine the fields to apply... def get_fields(self):