diff options
| author | Tom Christie | 2014-10-09 15:11:19 +0100 | 
|---|---|---|
| committer | Tom Christie | 2014-10-09 15:11:19 +0100 | 
| commit | 5d247a65c89594a7ab5ce2333612f23eadc6828d (patch) | |
| tree | d9e67e3a84a588747cd6e39356151149cf73b376 /rest_framework/serializers.py | |
| parent | babdc78e61ac915fa4a01bdfb04e11a32dbf5d79 (diff) | |
| download | django-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.py | 35 | 
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          )  | 
