diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 2efe89610..8119cd05b 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -310,7 +310,8 @@ class Field(object): def __init__(self, read_only=False, write_only=False, required=None, default=empty, initial=empty, source=None, label=None, help_text=None, style=None, - error_messages=None, validators=None, allow_null=False): + error_messages=None, validators=None, allow_null=False, + permission=0, read_permission=0, write_permission=0): self._creation_counter = Field._creation_counter Field._creation_counter += 1 @@ -334,6 +335,9 @@ class Field(object): self.help_text = help_text self.style = {} if style is None else style self.allow_null = allow_null + self.permission = permission + self.read_permission = read_permission + self.write_permission = write_permission if self.default_empty_html is not empty: if default is not empty: @@ -443,8 +447,6 @@ class Field(object): try: return get_attribute(instance, self.source_attrs) except (KeyError, AttributeError) as exc: - if not self.required and self.default is empty: - raise SkipField() msg = ( 'Got {exc_type} when attempting to get a value for field ' '`{field}` on serializer `{serializer}`.\nThe serializer ' diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 4e3fbc4de..770635784 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -136,12 +136,14 @@ class SimpleRouter(BaseRouter): it from the viewset. """ queryset = getattr(viewset, 'queryset', None) - - assert queryset is not None, '`base_name` argument not specified, and could ' \ + model = getattr(viewset, 'model', None) + + assert ((queryset is not None) or (model is not None)), '`base_name` argument not specified, and could ' \ 'not automatically determine the name from the viewset, as ' \ 'it does not have a `.queryset` attribute.' - return queryset.model._meta.object_name.lower() + model = model if model is not None else queryset.model + return model._meta.object_name.lower() def get_routes(self, viewset): """ diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 94c37321f..69cc7a717 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -156,6 +156,14 @@ class BaseSerializer(Field): list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer) return list_serializer_class(*args, **list_kwargs) + ''' + HACK to pass context down to child serializers in rippling. + The right way might be to remove @cached_property from fields.py + and set self._context here + ''' + def set_context(self, context): + self.context = context; + def to_internal_value(self, data): raise NotImplementedError('`to_internal_value()` must be implemented.')