aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework/relations.py
diff options
context:
space:
mode:
authorTom Christie2013-05-28 12:08:36 +0100
committerTom Christie2013-05-28 12:08:36 +0100
commit22e1950e1cca237e6edeea3ddc9c798b975c6183 (patch)
tree43c32498b8d30f436d802a262f7388ec9961cee3 /rest_framework/relations.py
parent138f0cacdb0f093a4dc65ef98bf48ddbc27e18b2 (diff)
downloaddjango-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.py35
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)