12
12
from rest_framework .request import clone_request
13
13
14
14
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 ):
16
16
"""
17
17
Given a model instance, and an optional pk and slug field,
18
18
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):
23
23
include = []
24
24
25
25
if pk :
26
+ # Pending deprecation
26
27
pk_field = obj ._meta .pk
27
28
while pk_field .rel :
28
29
pk_field = pk_field .rel .to ._meta .pk
29
30
include .append (pk_field .name )
30
31
31
32
if slug_field :
33
+ # Pending deprecation
32
34
include .append (slug_field )
33
35
36
+ if lookup_field and lookup_field != 'pk' :
37
+ include .append (lookup_field )
38
+
34
39
return [field .name for field in obj ._meta .fields if field .name not in include ]
35
40
36
41
@@ -139,10 +144,14 @@ def pre_save(self, obj):
139
144
Set any attributes on the object that are implicit in the request.
140
145
"""
141
146
# pk and/or slug attributes are implicit in the URL.
147
+ lookup = self .kwargs .get (self .lookup_field , None )
142
148
pk = self .kwargs .get (self .pk_url_kwarg , None )
143
149
slug = self .kwargs .get (self .slug_url_kwarg , None )
144
150
slug_field = slug and self .slug_field or None
145
151
152
+ if lookup :
153
+ setattr (obj , self .lookup_field , lookup )
154
+
146
155
if pk :
147
156
setattr (obj , 'pk' , pk )
148
157
@@ -152,7 +161,7 @@ def pre_save(self, obj):
152
161
# Ensure we clean the attributes so that we don't eg return integer
153
162
# pk using a string representation, as provided by the url conf kwarg.
154
163
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 )
156
165
obj .full_clean (exclude )
157
166
158
167
0 commit comments