From 72cd350944e72fcc233b2cbaecf07fdf7c3faff0 Mon Sep 17 00:00:00 2001 From: paolopaolopaolo Date: Mon, 21 Sep 2015 10:45:07 -0700 Subject: [PATCH] Fixed #3265: - '_called_data_property' flag added to BaseSerializer - '_called_data_property' is False until serializer.data is called, at which point it becomes True - Assert statement added to '.save()', will throw AssertionError if '_called_data_property' is True --- rest_framework/serializers.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 037939e31..7082db0e6 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -79,6 +79,7 @@ class BaseSerializer(Field): .errors - Not available. .data - Available. """ + _called_data_property = False def __init__(self, instance=None, data=empty, **kwargs): self.instance = instance @@ -166,6 +167,13 @@ class BaseSerializer(Field): "For example: 'serializer.save(owner=request.user)'.'" ) + # Guard against calling 'serializer.data' before calling 'serializer.save()' + assert not self._called_data_property, ( + "You should not access `.data` property before calling `.save()`." + "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()) @@ -230,6 +238,8 @@ class BaseSerializer(Field): self._data = self.to_representation(self.validated_data) else: self._data = self.get_initial() + + self._called_data_property = True return self._data @property