aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/relations.py
diff options
context:
space:
mode:
authorTom Christie2013-06-04 14:05:35 +0100
committerTom Christie2013-06-04 14:05:35 +0100
commitc160e49321d77c6b1b99fc898e2624760edc137b (patch)
treecdb7b7e2680ef18f800d8cc251dd17456d60c0b8 /rest_framework/relations.py
parent478f6ff94a6f4ce68bae5133def0e7a042f3c85a (diff)
downloaddjango-rest-framework-c160e49321d77c6b1b99fc898e2624760edc137b.tar.bz2
Test cases and fix for plain-list relationships (ie not queryset) Closes #878.
Diffstat (limited to 'rest_framework/relations.py')
-rw-r--r--rest_framework/relations.py16
1 files changed, 13 insertions, 3 deletions
diff --git a/rest_framework/relations.py b/rest_framework/relations.py
index e3675b51..edaf76d6 100644
--- a/rest_framework/relations.py
+++ b/rest_framework/relations.py
@@ -12,7 +12,7 @@ from django.db.models.fields import BLANK_CHOICE_DASH
from django.forms import widgets
from django.forms.models import ModelChoiceIterator
from django.utils.translation import ugettext_lazy as _
-from rest_framework.fields import Field, WritableField, get_component
+from rest_framework.fields import Field, WritableField, get_component, is_simple_callable
from rest_framework.reverse import reverse
from rest_framework.compat import urlparse
from rest_framework.compat import smart_text
@@ -144,7 +144,12 @@ class RelatedField(WritableField):
return None
if self.many:
- return [self.to_native(item) for item in value.all()]
+ if is_simple_callable(getattr(value, 'all', None)):
+ return [self.to_native(item) for item in value.all()]
+ else:
+ # Also support non-queryset iterables.
+ # This allows us to also support plain lists of related items.
+ return [self.to_native(item) for item in value]
return self.to_native(value)
def field_from_native(self, data, files, field_name, into):
@@ -242,7 +247,12 @@ class PrimaryKeyRelatedField(RelatedField):
queryset = get_component(queryset, component)
# Forward relationship
- return [self.to_native(item.pk) for item in queryset.all()]
+ if is_simple_callable(getattr(queryset, 'all', None)):
+ return [self.to_native(item.pk) for item in queryset.all()]
+ else:
+ # Also support non-queryset iterables.
+ # This allows us to also support plain lists of related items.
+ return [self.to_native(item.pk) for item in queryset]
# To-one relationship
try: