diff options
| author | Jamie Matthews | 2012-10-22 15:12:25 +0100 | 
|---|---|---|
| committer | Jamie Matthews | 2012-10-22 15:12:25 +0100 | 
| commit | 45d4622f090f8d81a04b4d3e888017419676bbc0 (patch) | |
| tree | be8123972b230c118709a70cda0dd746c91645e2 /rest_framework/serializers.py | |
| parent | d53ee8a10c5fd3c95a577a409d39a394a838b0b7 (diff) | |
| download | django-rest-framework-45d4622f090f8d81a04b4d3e888017419676bbc0.tar.bz2 | |
Fix serialization of reverse relationships
Diffstat (limited to 'rest_framework/serializers.py')
| -rw-r--r-- | rest_framework/serializers.py | 23 | 
1 files changed, 13 insertions, 10 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 6724bbdf..221cbf2f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -247,6 +247,19 @@ class BaseSerializer(Field):          if not self._errors:              return self.restore_object(attrs, instance=getattr(self, 'object', None)) +    def field_to_native(self, obj, field_name): +        """ +        Override default so that we can apply ModelSerializer as a nested +        field to relationships. +        """ +        obj = getattr(obj, self.source or field_name) + +        # If the object has an "all" method, assume it's a relationship +        if is_simple_callable(getattr(obj, 'all', None)): +            return [self.to_native(item) for item in obj.all()] + +        return self.to_native(obj) +      @property      def errors(self):          """ @@ -295,16 +308,6 @@ class ModelSerializer(Serializer):      """      _options_class = ModelSerializerOptions -    def field_to_native(self, obj, field_name): -        """ -        Override default so that we can apply ModelSerializer as a nested -        field to relationships. -        """ -        obj = getattr(obj, self.source or field_name) -        if obj.__class__.__name__ in ('RelatedManager', 'ManyRelatedManager'): -            return [self.to_native(item) for item in obj.all()] -        return self.to_native(obj) -      def default_fields(self, serialize, obj=None, data=None, nested=False):          """          Return all the fields that should be serialized for the model.  | 
