diff options
| author | Tom Christie | 2013-05-28 12:08:36 +0100 | 
|---|---|---|
| committer | Tom Christie | 2013-05-28 12:08:36 +0100 | 
| commit | 22e1950e1cca237e6edeea3ddc9c798b975c6183 (patch) | |
| tree | 43c32498b8d30f436d802a262f7388ec9961cee3 /rest_framework/relations.py | |
| parent | 138f0cacdb0f093a4dc65ef98bf48ddbc27e18b2 (diff) | |
| download | django-rest-framework-22e1950e1cca237e6edeea3ddc9c798b975c6183.tar.bz2 | |
Backwards compatible approach to HyperlinkedIdentityField URLs.  Closes #892
Diffstat (limited to 'rest_framework/relations.py')
| -rw-r--r-- | rest_framework/relations.py | 35 | 
1 files changed, 18 insertions, 17 deletions
| diff --git a/rest_framework/relations.py b/rest_framework/relations.py index c4271e33..41707efc 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -518,8 +518,6 @@ class HyperlinkedIdentityField(Field):          request = self.context.get('request', None)          format = self.context.get('format', None)          view_name = self.view_name or self.parent.opts.view_name -        lookup_field = getattr(obj, self.lookup_field) -        kwargs = {self.lookup_field: lookup_field}          if request is None:              warnings.warn("Using `HyperlinkedIdentityField` without including the " @@ -539,27 +537,30 @@ class HyperlinkedIdentityField(Field):          if format and self.format and self.format != format:              format = self.format +        lookup_field = getattr(obj, self.lookup_field) +        kwargs = {self.lookup_field: lookup_field}          try:              return reverse(view_name, kwargs=kwargs, request=request, format=format)          except NoReverseMatch:              pass -        slug = getattr(obj, self.slug_field, None) - -        if not slug: -            raise Exception('Could not resolve URL for field using view name "%s"' % view_name) - -        kwargs = {self.slug_url_kwarg: slug} -        try: -            return reverse(view_name, kwargs=kwargs, request=request, format=format) -        except NoReverseMatch: -            pass +        if self.pk_url_kwarg != 'pk': +            # Only try pk lookup if it has been explicitly set. +            # Otherwise, the default `lookup_field = 'pk'` has us covered. +            kwargs = {self.pk_url_kwarg: obj.pk} +            try: +                return reverse(view_name, kwargs=kwargs, request=request, format=format) +            except NoReverseMatch: +                pass -        kwargs = {self.pk_url_kwarg: obj.pk, self.slug_url_kwarg: slug} -        try: -            return reverse(view_name, kwargs=kwargs, request=request, format=format) -        except NoReverseMatch: -            pass +        slug = getattr(obj, self.slug_field, None) +        if slug: +            # Only use slug lookup if a slug field exists on the model +            kwargs = {self.slug_url_kwarg: slug} +            try: +                return reverse(view_name, kwargs=kwargs, request=request, format=format) +            except NoReverseMatch: +                pass          raise Exception('Could not resolve URL for field using view name "%s"' % view_name) | 
