Skip to content

Commit e5e6329

Browse files
committed
Remove pk_url_field, slug_url_field, slug_field.
Closes #1773.
1 parent b3bbf41 commit e5e6329

File tree

3 files changed

+15
-174
lines changed

3 files changed

+15
-174
lines changed

rest_framework/generics.py

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,6 @@ class GenericAPIView(views.APIView):
7676
model_serializer_class = api_settings.DEFAULT_MODEL_SERIALIZER_CLASS
7777
paginator_class = Paginator
7878

79-
######################################
80-
# These are pending deprecation...
81-
82-
pk_url_kwarg = 'pk'
83-
slug_url_kwarg = 'slug'
84-
slug_field = 'slug'
85-
8679
def get_serializer_context(self):
8780
"""
8881
Extra context provided to the serializer class.
@@ -270,51 +263,30 @@ def get_queryset(self):
270263
error_format = "'%s' must define 'queryset' or 'model'"
271264
raise ImproperlyConfigured(error_format % self.__class__.__name__)
272265

273-
def get_object(self, queryset=None):
266+
def get_object(self):
274267
"""
275268
Returns the object the view is displaying.
276269
277270
You may want to override this if you need to provide non-standard
278271
queryset lookups. Eg if objects are referenced using multiple
279272
keyword arguments in the url conf.
280273
"""
281-
# Determine the base queryset to use.
282-
if queryset is None:
283-
queryset = self.filter_queryset(self.get_queryset())
284-
else:
285-
pass # Deprecation warning
274+
queryset = self.filter_queryset(self.get_queryset())
286275

287276
# Perform the lookup filtering.
288277
# Note that `pk` and `slug` are deprecated styles of lookup filtering.
289278
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
290279
lookup = self.kwargs.get(lookup_url_kwarg, None)
291-
pk = self.kwargs.get(self.pk_url_kwarg, None)
292-
slug = self.kwargs.get(self.slug_url_kwarg, None)
293280

294-
if lookup is not None:
295-
filter_kwargs = {self.lookup_field: lookup}
296-
elif pk is not None and self.lookup_field == 'pk':
297-
warnings.warn(
298-
'The `pk_url_kwarg` attribute is deprecated. '
299-
'Use the `lookup_field` attribute instead',
300-
DeprecationWarning
301-
)
302-
filter_kwargs = {'pk': pk}
303-
elif slug is not None and self.lookup_field == 'pk':
304-
warnings.warn(
305-
'The `slug_url_kwarg` attribute is deprecated. '
306-
'Use the `lookup_field` attribute instead',
307-
DeprecationWarning
308-
)
309-
filter_kwargs = {self.slug_field: slug}
310-
else:
281+
if lookup is None:
311282
raise ImproperlyConfigured(
312283
'Expected view %s to be called with a URL keyword argument '
313284
'named "%s". Fix your URL conf, or set the `.lookup_field` '
314285
'attribute on the view correctly.' %
315286
(self.__class__.__name__, self.lookup_field)
316287
)
317288

289+
filter_kwargs = {self.lookup_field: lookup}
318290
obj = get_object_or_404(queryset, **filter_kwargs)
319291

320292
# May raise a permission denied

rest_framework/mixins.py

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,23 @@
1212
from rest_framework.response import Response
1313
from rest_framework.request import clone_request
1414
from rest_framework.settings import api_settings
15-
import warnings
1615

1716

18-
def _get_validation_exclusions(obj, pk=None, slug_field=None, lookup_field=None):
17+
def _get_validation_exclusions(obj, lookup_field=None):
1918
"""
2019
Given a model instance, and an optional pk and slug field,
2120
return the full list of all other field names on that model.
2221
2322
For use when performing full_clean on a model instance,
2423
so we only clean the required fields.
2524
"""
26-
include = []
27-
28-
if pk:
29-
# Deprecated
25+
if lookup_field == 'pk':
3026
pk_field = obj._meta.pk
3127
while pk_field.rel:
3228
pk_field = pk_field.rel.to._meta.pk
33-
include.append(pk_field.name)
34-
35-
if slug_field:
36-
# Deprecated
37-
include.append(slug_field)
38-
39-
if lookup_field and lookup_field != 'pk':
40-
include.append(lookup_field)
29+
lookup_field = pk_field.name
4130

42-
return [field.name for field in obj._meta.fields if field.name not in include]
31+
return [field.name for field in obj._meta.fields if field.name != lookup_field]
4332

4433

4534
class CreateModelMixin(object):
@@ -146,26 +135,15 @@ def pre_save(self, obj):
146135
"""
147136
Set any attributes on the object that are implicit in the request.
148137
"""
149-
# pk and/or slug attributes are implicit in the URL.
150138
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
151-
lookup = self.kwargs.get(lookup_url_kwarg, None)
152-
pk = self.kwargs.get(self.pk_url_kwarg, None)
153-
slug = self.kwargs.get(self.slug_url_kwarg, None)
154-
slug_field = slug and self.slug_field or None
155-
156-
if lookup:
157-
setattr(obj, self.lookup_field, lookup)
158-
159-
if pk:
160-
setattr(obj, 'pk', pk)
139+
lookup_value = self.kwargs[lookup_url_kwarg]
161140

162-
if slug:
163-
setattr(obj, slug_field, slug)
141+
setattr(obj, self.lookup_field, lookup_value)
164142

165143
# Ensure we clean the attributes so that we don't eg return integer
166144
# pk using a string representation, as provided by the url conf kwarg.
167145
if hasattr(obj, 'full_clean'):
168-
exclude = _get_validation_exclusions(obj, pk, slug_field, self.lookup_field)
146+
exclude = _get_validation_exclusions(obj, self.lookup_field)
169147
obj.full_clean(exclude)
170148

171149

rest_framework/relations.py

Lines changed: 4 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from rest_framework.reverse import reverse
1717
from rest_framework.compat import urlparse
1818
from rest_framework.compat import smart_text
19-
import warnings
2019

2120

2221
# Relational fields
@@ -320,11 +319,6 @@ class HyperlinkedRelatedField(RelatedField):
320319
'incorrect_type': _('Incorrect type. Expected url string, received %s.'),
321320
}
322321

323-
# These are all deprecated
324-
pk_url_kwarg = 'pk'
325-
slug_field = 'slug'
326-
slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden
327-
328322
def __init__(self, *args, **kwargs):
329323
try:
330324
self.view_name = kwargs.pop('view_name')
@@ -334,22 +328,6 @@ def __init__(self, *args, **kwargs):
334328
self.lookup_field = kwargs.pop('lookup_field', self.lookup_field)
335329
self.format = kwargs.pop('format', None)
336330

337-
# These are deprecated
338-
if 'pk_url_kwarg' in kwargs:
339-
msg = 'pk_url_kwarg is deprecated. Use lookup_field instead.'
340-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
341-
if 'slug_url_kwarg' in kwargs:
342-
msg = 'slug_url_kwarg is deprecated. Use lookup_field instead.'
343-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
344-
if 'slug_field' in kwargs:
345-
msg = 'slug_field is deprecated. Use lookup_field instead.'
346-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
347-
348-
self.pk_url_kwarg = kwargs.pop('pk_url_kwarg', self.pk_url_kwarg)
349-
self.slug_field = kwargs.pop('slug_field', self.slug_field)
350-
default_slug_kwarg = self.slug_url_kwarg or self.slug_field
351-
self.slug_url_kwarg = kwargs.pop('slug_url_kwarg', default_slug_kwarg)
352-
353331
super(HyperlinkedRelatedField, self).__init__(*args, **kwargs)
354332

355333
def get_url(self, obj, view_name, request, format):
@@ -361,39 +339,7 @@ def get_url(self, obj, view_name, request, format):
361339
"""
362340
lookup_field = getattr(obj, self.lookup_field)
363341
kwargs = {self.lookup_field: lookup_field}
364-
try:
365-
return reverse(view_name, kwargs=kwargs, request=request, format=format)
366-
except NoReverseMatch:
367-
pass
368-
369-
if self.pk_url_kwarg != 'pk':
370-
# Only try pk if it has been explicitly set.
371-
# Otherwise, the default `lookup_field = 'pk'` has us covered.
372-
pk = obj.pk
373-
kwargs = {self.pk_url_kwarg: pk}
374-
try:
375-
return reverse(view_name, kwargs=kwargs, request=request, format=format)
376-
except NoReverseMatch:
377-
pass
378-
379-
slug = getattr(obj, self.slug_field, None)
380-
if slug is not None:
381-
# Only try slug if it corresponds to an attribute on the object.
382-
kwargs = {self.slug_url_kwarg: slug}
383-
try:
384-
ret = reverse(view_name, kwargs=kwargs, request=request, format=format)
385-
if self.slug_field == 'slug' and self.slug_url_kwarg == 'slug':
386-
# If the lookup succeeds using the default slug params,
387-
# then `slug_field` is being used implicitly, and we
388-
# we need to warn about the pending deprecation.
389-
msg = 'Implicit slug field hyperlinked fields are deprecated.' \
390-
'You should set `lookup_field=slug` on the HyperlinkedRelatedField.'
391-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
392-
return ret
393-
except NoReverseMatch:
394-
pass
395-
396-
raise NoReverseMatch()
342+
return reverse(view_name, kwargs=kwargs, request=request, format=format)
397343

398344
def get_object(self, queryset, view_name, view_args, view_kwargs):
399345
"""
@@ -402,19 +348,8 @@ def get_object(self, queryset, view_name, view_args, view_kwargs):
402348
Takes the matched URL conf arguments, and the queryset, and should
403349
return an object instance, or raise an `ObjectDoesNotExist` exception.
404350
"""
405-
lookup = view_kwargs.get(self.lookup_field, None)
406-
pk = view_kwargs.get(self.pk_url_kwarg, None)
407-
slug = view_kwargs.get(self.slug_url_kwarg, None)
408-
409-
if lookup is not None:
410-
filter_kwargs = {self.lookup_field: lookup}
411-
elif pk is not None:
412-
filter_kwargs = {'pk': pk}
413-
elif slug is not None:
414-
filter_kwargs = {self.slug_field: slug}
415-
else:
416-
raise ObjectDoesNotExist()
417-
351+
lookup_value = view_kwargs[self.lookup_field]
352+
filter_kwargs = {self.lookup_field: lookup_value}
418353
return queryset.get(**filter_kwargs)
419354

420355
def to_native(self, obj):
@@ -486,11 +421,6 @@ class HyperlinkedIdentityField(Field):
486421
lookup_field = 'pk'
487422
read_only = True
488423

489-
# These are all deprecated
490-
pk_url_kwarg = 'pk'
491-
slug_field = 'slug'
492-
slug_url_kwarg = None # Defaults to same as `slug_field` unless overridden
493-
494424
def __init__(self, *args, **kwargs):
495425
try:
496426
self.view_name = kwargs.pop('view_name')
@@ -502,22 +432,6 @@ def __init__(self, *args, **kwargs):
502432
lookup_field = kwargs.pop('lookup_field', None)
503433
self.lookup_field = lookup_field or self.lookup_field
504434

505-
# These are deprecated
506-
if 'pk_url_kwarg' in kwargs:
507-
msg = 'pk_url_kwarg is deprecated. Use lookup_field instead.'
508-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
509-
if 'slug_url_kwarg' in kwargs:
510-
msg = 'slug_url_kwarg is deprecated. Use lookup_field instead.'
511-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
512-
if 'slug_field' in kwargs:
513-
msg = 'slug_field is deprecated. Use lookup_field instead.'
514-
warnings.warn(msg, DeprecationWarning, stacklevel=2)
515-
516-
self.slug_field = kwargs.pop('slug_field', self.slug_field)
517-
default_slug_kwarg = self.slug_url_kwarg or self.slug_field
518-
self.pk_url_kwarg = kwargs.pop('pk_url_kwarg', self.pk_url_kwarg)
519-
self.slug_url_kwarg = kwargs.pop('slug_url_kwarg', default_slug_kwarg)
520-
521435
super(HyperlinkedIdentityField, self).__init__(*args, **kwargs)
522436

523437
def field_to_native(self, obj, field_name):
@@ -569,27 +483,4 @@ def get_url(self, obj, view_name, request, format):
569483
if lookup_field is None:
570484
return None
571485

572-
try:
573-
return reverse(view_name, kwargs=kwargs, request=request, format=format)
574-
except NoReverseMatch:
575-
pass
576-
577-
if self.pk_url_kwarg != 'pk':
578-
# Only try pk lookup if it has been explicitly set.
579-
# Otherwise, the default `lookup_field = 'pk'` has us covered.
580-
kwargs = {self.pk_url_kwarg: obj.pk}
581-
try:
582-
return reverse(view_name, kwargs=kwargs, request=request, format=format)
583-
except NoReverseMatch:
584-
pass
585-
586-
slug = getattr(obj, self.slug_field, None)
587-
if slug:
588-
# Only use slug lookup if a slug field exists on the model
589-
kwargs = {self.slug_url_kwarg: slug}
590-
try:
591-
return reverse(view_name, kwargs=kwargs, request=request, format=format)
592-
except NoReverseMatch:
593-
pass
594-
595-
raise NoReverseMatch()
486+
return reverse(view_name, kwargs=kwargs, request=request, format=format)

0 commit comments

Comments
 (0)