From e34a34e90b870424fc9a59952bfb80452d169306 Mon Sep 17 00:00:00 2001 From: Jared Lang Date: Wed, 24 Feb 2016 13:36:39 -0800 Subject: [PATCH] Fix empty pk detection in HyperlinkRelatedField.get_url This implementation allows detection of empty values that are non-nullable, allowing the field to return None values for such cases --- rest_framework/relations.py | 2 +- tests/test_relations.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 7e04e7e47..2b7906a59 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -280,7 +280,7 @@ class HyperlinkedRelatedField(RelatedField): attributes are not configured to correctly match the URL conf. """ # Unsaved objects will not yet have a valid URL. - if hasattr(obj, 'pk') and obj.pk is None: + if hasattr(obj, 'pk') and obj.pk in (None, ''): return None lookup_value = getattr(obj, self.lookup_field) diff --git a/tests/test_relations.py b/tests/test_relations.py index 240878394..a070ad6de 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -87,6 +87,18 @@ class TestProxiedPrimaryKeyRelatedField(APISimpleTestCase): assert representation == self.instance.pk.int +class TestHyperlinkedRelatedField(APISimpleTestCase): + def setUp(self): + self.field = serializers.HyperlinkedRelatedField( + view_name='example', read_only=True) + self.field.reverse = mock_reverse + self.field._context = {'request': True} + + def test_representation_unsaved_object_with_non_nullable_pk(self): + representation = self.field.to_representation(MockObject(pk='')) + assert representation is None + + class TestHyperlinkedIdentityField(APISimpleTestCase): def setUp(self): self.instance = MockObject(pk=1, name='foo')