aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/serializers.py
diff options
context:
space:
mode:
authorTom Christie2014-10-09 15:11:19 +0100
committerTom Christie2014-10-09 15:11:19 +0100
commit5d247a65c89594a7ab5ce2333612f23eadc6828d (patch)
treed9e67e3a84a588747cd6e39356151149cf73b376 /rest_framework/serializers.py
parentbabdc78e61ac915fa4a01bdfb04e11a32dbf5d79 (diff)
downloaddjango-rest-framework-5d247a65c89594a7ab5ce2333612f23eadc6828d.tar.bz2
First pass on nested serializers in HTML
Diffstat (limited to 'rest_framework/serializers.py')
-rw-r--r--rest_framework/serializers.py35
1 files changed, 27 insertions, 8 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 9fcbcba7..1c006990 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -166,14 +166,25 @@ class BoundField(object):
Returned when iterating over a serializer instance,
providing an API similar to Django forms and form fields.
"""
- def __init__(self, field, value, errors):
+ def __init__(self, field, value, errors, prefix=''):
self._field = field
self.value = value
self.errors = errors
+ self.name = prefix + self.field_name
def __getattr__(self, attr_name):
return getattr(self._field, attr_name)
+ def __iter__(self):
+ for field in self.fields.values():
+ yield self[field.field_name]
+
+ def __getitem__(self, key):
+ field = self.fields[key]
+ value = self.value.get(key) if self.value else None
+ error = self.errors.get(key) if self.errors else None
+ return BoundField(field, value, error, prefix=self.name + '.')
+
@property
def _proxy_class(self):
return self._field.__class__
@@ -355,15 +366,22 @@ class Serializer(BaseSerializer):
def validate(self, attrs):
return attrs
+ def __repr__(self):
+ return representation.serializer_repr(self, indent=1)
+
+ # The following are used for accessing `BoundField` instances on the
+ # serializer, for the purposes of presenting a form-like API onto the
+ # field values and field errors.
+
def __iter__(self):
- errors = self.errors if hasattr(self, '_errors') else {}
for field in self.fields.values():
- value = self.data.get(field.field_name) if self.data else None
- error = errors.get(field.field_name)
- yield BoundField(field, value, error)
+ yield self[field.field_name]
- def __repr__(self):
- return representation.serializer_repr(self, indent=1)
+ def __getitem__(self, key):
+ field = self.fields[key]
+ value = self.data.get(key)
+ error = self.errors.get(key) if hasattr(self, '_errors') else None
+ return BoundField(field, value, error)
# There's some replication of `ListField` here,
@@ -404,8 +422,9 @@ class ListSerializer(BaseSerializer):
"""
List of object instances -> List of dicts of primitive datatypes.
"""
+ iterable = data.all() if (hasattr(data, 'all')) else data
return ReturnList(
- [self.child.to_representation(item) for item in data],
+ [self.child.to_representation(item) for item in iterable],
serializer=self
)