Skip to content

Commit e4067bf

Browse files
introduce lookup_field and add pendingdeprecationwarnings
1 parent ddbbe78 commit e4067bf

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

rest_framework/mixins.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from rest_framework.request import clone_request
1313

1414

15-
def _get_validation_exclusions(obj, pk=None, slug_field=None):
15+
def _get_validation_exclusions(obj, pk=None, slug_field=None, lookup_field=None):
1616
"""
1717
Given a model instance, and an optional pk and slug field,
1818
return the full list of all other field names on that model.
@@ -23,14 +23,19 @@ def _get_validation_exclusions(obj, pk=None, slug_field=None):
2323
include = []
2424

2525
if pk:
26+
# Pending deprecation
2627
pk_field = obj._meta.pk
2728
while pk_field.rel:
2829
pk_field = pk_field.rel.to._meta.pk
2930
include.append(pk_field.name)
3031

3132
if slug_field:
33+
# Pending deprecation
3234
include.append(slug_field)
3335

36+
if lookup_field and lookup_field != 'pk':
37+
include.append(lookup_field)
38+
3439
return [field.name for field in obj._meta.fields if field.name not in include]
3540

3641

@@ -139,10 +144,14 @@ def pre_save(self, obj):
139144
Set any attributes on the object that are implicit in the request.
140145
"""
141146
# pk and/or slug attributes are implicit in the URL.
147+
lookup = self.kwargs.get(self.lookup_field, None)
142148
pk = self.kwargs.get(self.pk_url_kwarg, None)
143149
slug = self.kwargs.get(self.slug_url_kwarg, None)
144150
slug_field = slug and self.slug_field or None
145151

152+
if lookup:
153+
setattr(obj, self.lookup_field, lookup)
154+
146155
if pk:
147156
setattr(obj, 'pk', pk)
148157

@@ -152,7 +161,7 @@ def pre_save(self, obj):
152161
# Ensure we clean the attributes so that we don't eg return integer
153162
# pk using a string representation, as provided by the url conf kwarg.
154163
if hasattr(obj, 'full_clean'):
155-
exclude = _get_validation_exclusions(obj, pk, slug_field)
164+
exclude = _get_validation_exclusions(obj, pk, slug_field, self.lookup_field)
156165
obj.full_clean(exclude)
157166

158167

rest_framework/relations.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,16 @@ def __init__(self, *args, **kwargs):
314314
self.format = kwargs.pop('format', None)
315315

316316
# These are pending deprecation
317+
if 'pk_url_kwarg' in kwargs:
318+
msg = 'pk_url_kwarg is pending deprecation. Use lookup_field instead.'
319+
warnings.warn(msg, PendingDeprecationWarning, stacklevel=2)
320+
if 'slug_url_kwarg' in kwargs:
321+
msg = 'slug_url_kwarg is pending deprecation. Use lookup_field instead.'
322+
warnings.warn(msg, PendingDeprecationWarning, stacklevel=2)
323+
if 'slug_field' in kwargs:
324+
msg = 'slug_field is pending deprecation. Use lookup_field instead.'
325+
warnings.warn(msg, PendingDeprecationWarning, stacklevel=2)
326+
317327
self.pk_url_kwarg = kwargs.pop('pk_url_kwarg', self.pk_url_kwarg)
318328
self.slug_field = kwargs.pop('slug_field', self.slug_field)
319329
default_slug_kwarg = self.slug_url_kwarg or self.slug_field

0 commit comments

Comments
 (0)