Separate kwargs from lookup in HyperlinkedRelatedField.get_object/get_url

DRF extensions, like DRF-nested-routers, can have more lookups
than just the PK.  Currently would need to completely re-implement
get_object/get_url instead of just adding to the lookup dict.
This commit is contained in:
Christian Sauer 2016-12-26 14:39:02 -05:00
parent 56f0138bb9
commit 2cb2cc7f9b

View File

@ -291,10 +291,18 @@ class HyperlinkedRelatedField(RelatedField):
Takes the matched URL conf arguments, and should return an
object instance, or raise an `ObjectDoesNotExist` exception.
"""
lookup_value = view_kwargs[self.lookup_url_kwarg]
lookup_kwargs = {self.lookup_field: lookup_value}
lookup_kwargs = self.get_object_kwargs(view_name, view_args, view_kwargs)
return self.get_queryset().get(**lookup_kwargs)
def get_object_kwargs(self, view_name, view_args, view_kwargs):
"""
Get default kwargs for looking up an object.
Separate for subclassing purposes.
"""
lookup_value = view_kwargs[self.lookup_url_kwarg]
return {self.lookup_field: lookup_value}
def get_url(self, obj, view_name, request, format):
"""
Given an object, return the URL that hyperlinks to the object.
@ -306,10 +314,18 @@ class HyperlinkedRelatedField(RelatedField):
if hasattr(obj, 'pk') and obj.pk in (None, ''):
return None
lookup_value = getattr(obj, self.lookup_field)
kwargs = {self.lookup_url_kwarg: lookup_value}
kwargs = self.get_url_kwargs(obj, view_name, request, format)
return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
def get_url_kwargs(self, obj, view_name, request, format):
"""
Get default kwargs for creating the object's URL.
Separate for subclassing purposes.
"""
lookup_value = getattr(obj, self.lookup_field)
return {self.lookup_url_kwarg: lookup_value}
def to_internal_value(self, data):
request = self.context.get('request', None)
try: