aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/topics/release-notes.md1
-rw-r--r--rest_framework/serializers.py8
2 files changed, 8 insertions, 1 deletions
diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md
index d3f85e6e..1ddd8351 100644
--- a/docs/topics/release-notes.md
+++ b/docs/topics/release-notes.md
@@ -43,6 +43,7 @@ You can determine your currently installed version using `pip freeze`:
### Master
* JSON renderer now deals with objects that implement a dict-like interface.
+* Bugfix: Refine behavior that calls model manager `all()` across nested serializer relationships, preventing erronous behavior with some non-ORM objects, and preventing unneccessary queryset re-evaluations.
### 2.3.10
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 44e4b04b..0d35fb32 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -412,7 +412,13 @@ class BaseSerializer(WritableField):
# Set the serializer object if it exists
obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None
- obj = obj.all() if is_simple_callable(getattr(obj, 'all', None)) else obj
+
+ # If we have a model manager or similar object then we need
+ # to iterate through each instance.
+ if (self.many and
+ not hasattr(obj, '__iter__') and
+ is_simple_callable(getattr(obj, 'all', None))):
+ obj = obj.all()
if self.source == '*':
if value: