aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/authtoken/views.py14
-rw-r--r--rest_framework/fields.py8
-rw-r--r--rest_framework/relations.py19
-rw-r--r--rest_framework/request.py2
-rw-r--r--rest_framework/serializers.py13
5 files changed, 31 insertions, 25 deletions
diff --git a/rest_framework/authtoken/views.py b/rest_framework/authtoken/views.py
index 103abb27..b75c2e25 100644
--- a/rest_framework/authtoken/views.py
+++ b/rest_framework/authtoken/views.py
@@ -1,5 +1,4 @@
from rest_framework.views import APIView
-from rest_framework import status
from rest_framework import parsers
from rest_framework import renderers
from rest_framework.response import Response
@@ -12,16 +11,13 @@ class ObtainAuthToken(APIView):
permission_classes = ()
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
- serializer_class = AuthTokenSerializer
- model = Token
def post(self, request):
- serializer = self.serializer_class(data=request.data)
- if serializer.is_valid():
- user = serializer.validated_data['user']
- token, created = Token.objects.get_or_create(user=user)
- return Response({'token': token.key})
- return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
+ serializer = AuthTokenSerializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+ user = serializer.validated_data['user']
+ token, created = Token.objects.get_or_create(user=user)
+ return Response({'token': token.key})
obtain_auth_token = ObtainAuthToken.as_view()
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 3cf34886..ca9c479f 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -68,8 +68,8 @@ def get_attribute(instance, attrs):
return instance[attr]
except (KeyError, TypeError, AttributeError):
raise exc
- if is_simple_callable(instance):
- return instance()
+ if is_simple_callable(instance):
+ instance = instance()
return instance
@@ -321,7 +321,6 @@ class Field(object):
value = self.to_internal_value(data)
self.run_validators(value)
- self.validate(value)
return value
def run_validators(self, value):
@@ -348,9 +347,6 @@ class Field(object):
if errors:
raise ValidationError(errors)
- def validate(self, value):
- pass
-
def to_internal_value(self, data):
"""
Transform the *incoming* primitive data into a native value.
diff --git a/rest_framework/relations.py b/rest_framework/relations.py
index 79c8057b..d1ea497a 100644
--- a/rest_framework/relations.py
+++ b/rest_framework/relations.py
@@ -49,6 +49,21 @@ class RelatedField(Field):
@classmethod
def many_init(cls, *args, **kwargs):
+ """
+ This method handles creating a parent `ManyRelatedField` instance
+ when the `many=True` keyword argument is passed.
+
+ Typically you won't need to override this method.
+
+ Note that we're over-cautious in passing most arguments to both parent
+ and child classes in order to try to cover the general case. If you're
+ overriding this method you'll probably want something much simpler, eg:
+
+ @classmethod
+ def many_init(cls, *args, **kwargs):
+ kwargs['child'] = cls()
+ return CustomManyRelatedField(*args, **kwargs)
+ """
list_kwargs = {'child_relation': cls(*args, **kwargs)}
for key in kwargs.keys():
if key in MANY_RELATION_KWARGS:
@@ -306,7 +321,9 @@ class ManyRelatedField(Field):
The `ManyRelatedField` class is responsible for handling iterating through
the values and passing each one to the child relationship.
- You shouldn't need to be using this class directly yourself.
+ This class is treated as private API.
+ You shouldn't generally need to be using this class directly yourself,
+ and should instead simply set 'many=True' on the relationship.
"""
initial = []
default_empty_html = []
diff --git a/rest_framework/request.py b/rest_framework/request.py
index 096b3042..d7e74674 100644
--- a/rest_framework/request.py
+++ b/rest_framework/request.py
@@ -310,7 +310,7 @@ class Request(object):
def _load_data_and_files(self):
"""
- Parses the request content into self.DATA and self.FILES.
+ Parses the request content into `self.data`.
"""
if not _hasattr(self, '_content_type'):
self._load_method_and_content_type()
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 00362dbb..f7aa3a7d 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -102,7 +102,9 @@ class BaseSerializer(Field):
(key, value) for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS
]))
- return ListSerializer(*args, **list_kwargs)
+ meta = getattr(cls, 'Meta', None)
+ list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
+ return list_serializer_class(*args, **list_kwargs)
def to_internal_value(self, data):
raise NotImplementedError('`to_internal_value()` must be implemented.')
@@ -371,14 +373,9 @@ class Serializer(BaseSerializer):
for field in fields:
attribute = field.get_attribute(instance)
if attribute is None:
- value = None
+ ret[field.field_name] = None
else:
- value = field.to_representation(attribute)
- transform_method = getattr(self, 'transform_' + field.field_name, None)
- if transform_method is not None:
- value = transform_method(value)
-
- ret[field.field_name] = value
+ ret[field.field_name] = field.to_representation(attribute)
return ret