From e621ceddea83b815d9fcf8b5f1120e8771e23c63 Mon Sep 17 00:00:00 2001 From: hippp Date: Wed, 11 Feb 2015 17:27:04 +0800 Subject: [PATCH] fix url field representation when lookup_field is a foreignkey, lookup_value should get from the referenced object's lookup_field(which is lookup_url_kwarg here) when lookup_value is None ,'' or not a string , HyperlinkedRelatedField should return None instead of http://foo/bar/None['', or just exception] for correct url reversing --- rest_framework/relations.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 13793f375..2c140083c 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -201,6 +201,22 @@ class HyperlinkedRelatedField(RelatedField): return None lookup_value = getattr(obj, self.lookup_field) + + import numbers + from django.utils import six + + if lookup_value is not None and not isinstance(lookup_value, six.string_types) and not isinstance(lookup_value, + numbers.Number): + + try: + lookup_value = getattr(lookup_value, self.lookup_url_kwarg) + except Exception: + lookup_value = getattr(lookup_value, 'pk') + + if lookup_value is None or (not isinstance(lookup_value, six.string_types) and not isinstance(lookup_value, + numbers.Number)) or '' == lookup_value: + return None + kwargs = {self.lookup_url_kwarg: lookup_value} return self.reverse(view_name, kwargs=kwargs, request=request, format=format)