mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 20:40:14 +03:00
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:
parent
56f0138bb9
commit
2cb2cc7f9b
|
@ -291,10 +291,18 @@ class HyperlinkedRelatedField(RelatedField):
|
||||||
Takes the matched URL conf arguments, and should return an
|
Takes the matched URL conf arguments, and should return an
|
||||||
object instance, or raise an `ObjectDoesNotExist` exception.
|
object instance, or raise an `ObjectDoesNotExist` exception.
|
||||||
"""
|
"""
|
||||||
lookup_value = view_kwargs[self.lookup_url_kwarg]
|
lookup_kwargs = self.get_object_kwargs(view_name, view_args, view_kwargs)
|
||||||
lookup_kwargs = {self.lookup_field: lookup_value}
|
|
||||||
return self.get_queryset().get(**lookup_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):
|
def get_url(self, obj, view_name, request, format):
|
||||||
"""
|
"""
|
||||||
Given an object, return the URL that hyperlinks to the object.
|
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, ''):
|
if hasattr(obj, 'pk') and obj.pk in (None, ''):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
lookup_value = getattr(obj, self.lookup_field)
|
kwargs = self.get_url_kwargs(obj, view_name, request, format)
|
||||||
kwargs = {self.lookup_url_kwarg: lookup_value}
|
|
||||||
return self.reverse(view_name, kwargs=kwargs, request=request, format=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):
|
def to_internal_value(self, data):
|
||||||
request = self.context.get('request', None)
|
request = self.context.get('request', None)
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user