diff options
Diffstat (limited to 'rest_framework/generics.py')
| -rw-r--r-- | rest_framework/generics.py | 50 | 
1 files changed, 35 insertions, 15 deletions
diff --git a/rest_framework/generics.py b/rest_framework/generics.py index 1e547b32..8647ad42 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -16,20 +16,24 @@ class BaseView(views.APIView):      """      serializer_class = None      model_serializer_class = api_settings.MODEL_SERIALIZER -    pagination_serializer_class = api_settings.PAGINATION_SERIALIZER -    paginate_by = api_settings.PAGINATE_BY      def get_serializer_context(self): +        """ +        Extra context provided to the serializer class. +        """          return {              'request': self.request, -            'format': self.kwargs.get('format', None) +            'format': self.format, +            'view': self          } -    def get_serializer(self, data=None, files=None, instance=None, kwargs=None): -        # TODO: add support for files -        # TODO: add support for seperate serializer/deserializer +    def get_serializer_class(self): +        """ +        Return the class to use for the serializer. +        Use `self.serializer_class`, falling back to constructing a +        model serializer class from `self.model_serializer_class` +        """          serializer_class = self.serializer_class -        kwargs = kwargs or {}          if serializer_class is None:              class DefaultSerializer(self.model_serializer_class): @@ -37,22 +41,38 @@ class BaseView(views.APIView):                      model = self.model              serializer_class = DefaultSerializer -        context = self.get_serializer_context() -        return serializer_class(data, instance=instance, context=context, **kwargs) +        return serializer_class -    def get_pagination_serializer(self, page=None): -        serializer_class = self.pagination_serializer_class +    def get_serializer(self, data=None, files=None, instance=None): +        # TODO: add support for files +        # TODO: add support for seperate serializer/deserializer +        serializer_class = self.get_serializer_class()          context = self.get_serializer_context() -        ret = serializer_class(instance=page, context=context) -        ret.fields['results'] = self.get_serializer(kwargs={'source': 'object_list'}) -        return ret +        return serializer_class(data, instance=instance, context=context)  class MultipleObjectBaseView(MultipleObjectMixin, BaseView):      """      Base class for generic views onto a queryset.      """ -    pass + +    pagination_serializer_class = api_settings.PAGINATION_SERIALIZER +    paginate_by = api_settings.PAGINATE_BY + +    def get_pagination_serializer_class(self): +        """ +        Return the class to use for the pagination serializer. +        """ +        class SerializerClass(self.pagination_serializer_class): +            class Meta: +                object_serializer_class = self.get_serializer_class() + +        return SerializerClass + +    def get_pagination_serializer(self, page=None): +        pagination_serializer_class = self.get_pagination_serializer_class() +        context = self.get_serializer_context() +        return pagination_serializer_class(instance=page, context=context)  class SingleObjectBaseView(SingleObjectMixin, BaseView):  | 
