lookup_field on hyperlink serializers

This commit is contained in:
Tom Christie 2013-05-05 16:47:45 +01:00
parent 2d44dc3f54
commit 538d2e35e7
2 changed files with 13 additions and 1 deletions

View File

@ -360,7 +360,15 @@ class HyperlinkedRelatedField(RelatedField):
# Only try slug if it corresponds to an attribute on the object. # Only try slug if it corresponds to an attribute on the object.
kwargs = {self.slug_url_kwarg: slug} kwargs = {self.slug_url_kwarg: slug}
try: try:
return reverse(view_name, kwargs=kwargs, request=request, format=format) ret = reverse(view_name, kwargs=kwargs, request=request, format=format)
if self.slug_field == 'slug' and self.slug_url_kwarg == 'slug':
# If the lookup succeeds using the default slug params,
# then `slug_field` is being used implicitly, and we
# we need to warn about the pending deprecation.
msg = 'Implicit slug field hyperlinked fields are pending deprecation.' \
'You should set `lookup_field=slug` on the HyperlinkedRelatedField.'
warnings.warn(msg, PendingDeprecationWarning, stacklevel=2)
return ret
except NoReverseMatch: except NoReverseMatch:
pass pass

View File

@ -827,6 +827,7 @@ class HyperlinkedModelSerializerOptions(ModelSerializerOptions):
def __init__(self, meta): def __init__(self, meta):
super(HyperlinkedModelSerializerOptions, self).__init__(meta) super(HyperlinkedModelSerializerOptions, self).__init__(meta)
self.view_name = getattr(meta, 'view_name', None) self.view_name = getattr(meta, 'view_name', None)
self.lookup_field = getattr(meta, 'slug_field', None)
class HyperlinkedModelSerializer(ModelSerializer): class HyperlinkedModelSerializer(ModelSerializer):
@ -875,6 +876,9 @@ class HyperlinkedModelSerializer(ModelSerializer):
if model_field: if model_field:
kwargs['required'] = not(model_field.null or model_field.blank) kwargs['required'] = not(model_field.null or model_field.blank)
if self.opts.lookup_field:
kwargs['lookup_field'] = self.opts.lookup_field
return self._hyperlink_field_class(**kwargs) return self._hyperlink_field_class(**kwargs)
def get_identity(self, data): def get_identity(self, data):