diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 037939e31..a3c26e1ee 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -166,6 +166,12 @@ class BaseSerializer(Field): "For example: 'serializer.save(owner=request.user)'.'" ) + assert not hasattr(self, '_data'), ( + "You cannot call `.save()` after accessing `serializer.data`." + "If you need to access data before committing to the database then " + "inspect 'serializer.validated_data' instead. " + ) + validated_data = dict( list(self.validated_data.items()) + list(kwargs.items()) diff --git a/tests/test_serializer.py b/tests/test_serializer.py index c18cbb584..741c6ab17 100644 --- a/tests/test_serializer.py +++ b/tests/test_serializer.py @@ -51,6 +51,16 @@ class TestSerializer: with pytest.raises(AttributeError): serializer.data + def test_data_access_before_save_raises_error(self): + def create(validated_data): + return validated_data + serializer = self.Serializer(data={'char': 'abc', 'integer': 123}) + serializer.create = create + assert serializer.is_valid() + assert serializer.data == {'char': 'abc', 'integer': 123} + with pytest.raises(AssertionError): + serializer.save() + class TestValidateMethod: def test_non_field_error_validate_method(self):