From dae5a5ce43f63e96c10dce2ad1e9c080db172a22 Mon Sep 17 00:00:00 2001 From: bphillips Date: Mon, 7 Dec 2015 11:13:04 -0500 Subject: [PATCH] Fixed Django1.9 compatibility and added test. --- rest_framework/serializers.py | 2 +- tests/test_model_serializer.py | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8ed812099..70ec08a20 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1132,7 +1132,7 @@ class ModelSerializer(Serializer): to_field = field_kwargs.pop('to_field', None) if relation_info.reverse: - if to_field and not relation_info.related_model_field.related_field.primary_key: + if to_field and not relation_info.related_model_field.related_fields[0][1].primary_key: field_kwargs['slug_field'] = to_field field_class = self.serializer_related_to_field else: diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 57e540e7a..9154a28bb 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -899,3 +899,38 @@ class TestDecimalFieldMappings(TestCase): serializer = TestSerializer() assert len(serializer.fields['decimal_field'].validators) == 2 + + +class Issue3674Test(TestCase): + def test_nonPK_foreignkey_model_serializer(self): + class TestParentModel(models.Model): + title = models.CharField(max_length=64) + + class TestChildModel(models.Model): + parent = models.ForeignKey(TestParentModel, related_name='children') + value = models.CharField(primary_key=True, max_length=64) + + class TestChildModelSerializer(serializers.ModelSerializer): + class Meta: + model = TestChildModel + fields = ('value', 'parent') + + class TestParentModelSerializer(serializers.ModelSerializer): + class Meta: + model = TestParentModel + fields = ('id', 'title', 'children') + + parent_expected = dedent(""" + TestParentModelSerializer(): + id = IntegerField(label='ID', read_only=True) + title = CharField(max_length=64) + children = PrimaryKeyRelatedField(many=True, queryset=TestChildModel.objects.all()) + """) + self.assertEqual(unicode_repr(TestParentModelSerializer()), parent_expected) + + child_expected = dedent(""" + TestChildModelSerializer(): + value = CharField(max_length=64, validators=[]) + parent = PrimaryKeyRelatedField(queryset=TestParentModel.objects.all()) + """) + self.assertEqual(unicode_repr(TestChildModelSerializer()), child_expected)