aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2014-10-22 10:32:32 +0100
committerTom Christie2014-10-22 10:32:32 +0100
commitc5d1be8eac6cdb5cce000ec7c55e1847bfcf2359 (patch)
treee15672da0e6e72dc2944108e27329a04e1e231bd /rest_framework
parent05cbec9dd7f9f0b6a9b59b29ac6c9272b6ae50d8 (diff)
downloaddjango-rest-framework-c5d1be8eac6cdb5cce000ec7c55e1847bfcf2359.tar.bz2
.validate() can raise field errors or non-field errors
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/serializers.py34
1 files changed, 25 insertions, 9 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index d29dc684..59f38a73 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -99,10 +99,10 @@ class BaseSerializer(Field):
def is_valid(self, raise_exception=False):
assert not hasattr(self, 'restore_object'), (
- 'Serializer %s has old-style version 2 `.restore_object()` '
+ 'Serializer `%s.%s` has old-style version 2 `.restore_object()` '
'that is no longer compatible with REST framework 3. '
'Use the new-style `.create()` and `.update()` methods instead.' %
- self.__class__.__name__
+ (self.__class__.__module__, self.__class__.__name__)
)
if not hasattr(self, '_validated_data'):
@@ -341,9 +341,22 @@ class Serializer(BaseSerializer):
value = self.validate(value)
assert value is not None, '.validate() should return the validated data'
except ValidationError as exc:
- raise ValidationError({
- api_settings.NON_FIELD_ERRORS_KEY: exc.detail
- })
+ if isinstance(exc.detail, dict):
+ # .validate() errors may be a dict, in which case, use
+ # standard {key: list of values} style.
+ raise ValidationError(dict([
+ (key, value if isinstance(value, list) else [value])
+ for key, value in exc.detail.items()
+ ]))
+ elif isinstance(exc.detail, list):
+ raise ValidationError({
+ api_settings.NON_FIELD_ERRORS_KEY: exc.detail
+ })
+ else:
+ raise ValidationError({
+ api_settings.NON_FIELD_ERRORS_KEY: [exc.detail]
+ })
+
return value
def to_internal_value(self, data):
@@ -507,14 +520,17 @@ class ModelSerializer(Serializer):
self._kwargs['validators'] = validators
def create(self, validated_attrs):
+ # Check that the user isn't trying to handle a writable nested field.
+ # If we don't do this explicitly they'd likely get a confusing
+ # error at the point of calling `Model.objects.create()`.
assert not any(
isinstance(field, BaseSerializer) and not field.read_only
for field in self.fields.values()
), (
'The `.create()` method does not suport nested writable fields '
'by default. Write an explicit `.create()` method for serializer '
- '%s, or set `read_only=True` on nested serializer fields.' %
- self.__class__.__name__
+ '`%s.%s`, or set `read_only=True` on nested serializer fields.' %
+ (self.__class__.__module__, self.__class__.__name__)
)
ModelClass = self.Meta.model
@@ -544,8 +560,8 @@ class ModelSerializer(Serializer):
), (
'The `.update()` method does not suport nested writable fields '
'by default. Write an explicit `.update()` method for serializer '
- '%s, or set `read_only=True` on nested serializer fields.' %
- self.__class__.__name__
+ '`%s.%s`, or set `read_only=True` on nested serializer fields.' %
+ (self.__class__.__module__, self.__class__.__name__)
)
for attr, value in validated_attrs.items():