aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2014-09-18 12:17:21 +0100
committerTom Christie2014-09-18 12:17:21 +0100
commit87734be5f41de921ac32ad1f6664db243aab6d07 (patch)
tree7c6b8d18dc0d505525154c69d112925a95174b5d /rest_framework
parent5b7e4af0d657a575cb15eea85a63a7100c636085 (diff)
downloaddjango-rest-framework-87734be5f41de921ac32ad1f6664db243aab6d07.tar.bz2
Configuration correctness tests on ModelSerializer
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/serializers.py30
1 files changed, 27 insertions, 3 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 99dcc349..9f3e53fd 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -10,7 +10,7 @@ python primitives.
2. The process of marshalling between python primitives and request and
response content is handled by parsers and renderers.
"""
-from django.core.exceptions import ValidationError
+from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.db import models
from django.utils import six
from django.utils.datastructures import SortedDict
@@ -358,6 +358,7 @@ class ModelSerializer(Serializer):
model = getattr(self.Meta, 'model')
fields = getattr(self.Meta, 'fields', None)
depth = getattr(self.Meta, 'depth', 0)
+ extra_kwargs = getattr(self.Meta, 'extra_kwargs', {})
# Retrieve metadata about fields & relationships on the model class.
info = model_meta.get_field_info(model)
@@ -405,9 +406,32 @@ class ModelSerializer(Serializer):
if not issubclass(field_cls, HyperlinkedRelatedField):
kwargs.pop('view_name', None)
- else:
- assert False, 'Field name `%s` is not valid.' % field_name
+ elif hasattr(model, field_name):
+ # Create a read only field for model methods and properties.
+ field_cls = ReadOnlyField
+ kwargs = {}
+ else:
+ raise ImproperlyConfigured(
+ 'Field name `%s` is not valid for model `%s`.' %
+ (field_name, model.__class__.__name__)
+ )
+
+ # Check that any fields declared on the class are
+ # also explicity included in `Meta.fields`.
+ missing_fields = set(declared_fields.keys()) - set(fields)
+ if missing_fields:
+ missing_field = list(missing_fields)[0]
+ raise ImproperlyConfigured(
+ 'Field `%s` has been declared on serializer `%s`, but '
+ 'is missing from `Meta.fields`.' %
+ (missing_field, self.__class__.__name__)
+ )
+
+ # Populate any kwargs defined in `Meta.extra_kwargs`
+ kwargs.update(extra_kwargs.get(field_name, {}))
+
+ # Create the serializer field.
ret[field_name] = field_cls(**kwargs)
return ret