From e2ec3800e75c5456d16d1327e4da66133d5e24b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ericson?= Date: Tue, 14 Jul 2015 02:10:15 -0300 Subject: [PATCH] Change key type for RelatedField and ManyRelatedField choices Fixes: #2416 choices() also did not work if queryset was a manager. It would raise a "'*Manager' object is not iterable" that would later get silenced by Django template system. --- rest_framework/relations.py | 4 ++-- tests/test_relations.py | 22 ++++++++++++++++++++++ tests/utils.py | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index c5cbfebcd..cf3add15f 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -111,10 +111,10 @@ class RelatedField(Field): def choices(self): return OrderedDict([ ( - six.text_type(self.to_representation(item)), + self.to_representation(item), six.text_type(item) ) - for item in self.get_queryset() + for item in self.get_queryset().all() ]) diff --git a/tests/test_relations.py b/tests/test_relations.py index fd37e63e3..f7c1ed0a7 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -5,6 +5,7 @@ from django.core.exceptions import ImproperlyConfigured from django.utils.datastructures import MultiValueDict from rest_framework import serializers +from rest_framework.compat import OrderedDict from rest_framework.fields import empty from rest_framework.test import APISimpleTestCase @@ -58,6 +59,13 @@ class TestPrimaryKeyRelatedField(APISimpleTestCase): instance = field.to_internal_value(self.instance.pk) assert instance is self.instance + def test_choices(self): + self.assertEquals( + OrderedDict([(1, ''), + (2, ''), + (3, '')]), + self.field.choices) + class TestProxiedPrimaryKeyRelatedField(APISimpleTestCase): def setUp(self): @@ -206,3 +214,17 @@ class TestManyRelatedField(APISimpleTestCase): mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) assert empty == self.field.get_value(mvd) + + def test_choices(self): + queryset = MockQueryset([ + MockObject(pk=1, name='foo'), + MockObject(pk=2, name='bar'), + MockObject(pk=3, name='baz') + ]) + field = serializers.ManyRelatedField( + child_relation=serializers.PrimaryKeyRelatedField(queryset=queryset)) + self.assertEquals( + OrderedDict([(1, ''), + (2, ''), + (3, '')]), + field.choices) diff --git a/tests/utils.py b/tests/utils.py index b90349967..7c729d4ea 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -53,6 +53,9 @@ class MockQueryset(object): return item raise ObjectDoesNotExist() + def all(self): + return self.items + class BadType(object): """