@@ -43,7 +43,6 @@ def _get_validation_exclusions(obj, pk=None, slug_field=None, lookup_field=None)
43
43
class CreateModelMixin (object ):
44
44
"""
45
45
Create a model instance.
46
- Should be mixed in with any `GenericAPIView`.
47
46
"""
48
47
def create (self , request , * args , ** kwargs ):
49
48
serializer = self .get_serializer (data = request .DATA , files = request .FILES )
@@ -68,7 +67,6 @@ def get_success_headers(self, data):
68
67
class ListModelMixin (object ):
69
68
"""
70
69
List a queryset.
71
- Should be mixed in with `MultipleObjectAPIView`.
72
70
"""
73
71
empty_error = "Empty list and '%(class_name)s.allow_empty' is False."
74
72
@@ -101,7 +99,6 @@ def list(self, request, *args, **kwargs):
101
99
class RetrieveModelMixin (object ):
102
100
"""
103
101
Retrieve a model instance.
104
- Should be mixed in with `SingleObjectAPIView`.
105
102
"""
106
103
def retrieve (self , request , * args , ** kwargs ):
107
104
self .object = self .get_object ()
@@ -112,17 +109,22 @@ def retrieve(self, request, *args, **kwargs):
112
109
class UpdateModelMixin (object ):
113
110
"""
114
111
Update a model instance.
115
- Should be mixed in with `SingleObjectAPIView`.
116
112
"""
117
- def update (self , request , * args , ** kwargs ):
118
- partial = kwargs .pop ('partial' , False )
119
- self .object = None
113
+ def get_object_or_none (self ):
120
114
try :
121
- self . object = self .get_object ()
115
+ return self .get_object ()
122
116
except Http404 :
123
117
# If this is a PUT-as-create operation, we need to ensure that
124
118
# we have relevant permissions, as if this was a POST request.
125
- self .check_permissions (clone_request (request , 'POST' ))
119
+ # This will either raise a PermissionDenied exception,
120
+ # or simply return None
121
+ self .check_permissions (clone_request (self .request , 'POST' ))
122
+
123
+ def update (self , request , * args , ** kwargs ):
124
+ partial = kwargs .pop ('partial' , False )
125
+ self .object = self .get_object_or_none ()
126
+
127
+ if self .object is None :
126
128
created = True
127
129
save_kwargs = {'force_insert' : True }
128
130
success_status_code = status .HTTP_201_CREATED
@@ -175,7 +177,6 @@ def pre_save(self, obj):
175
177
class DestroyModelMixin (object ):
176
178
"""
177
179
Destroy a model instance.
178
- Should be mixed in with `SingleObjectAPIView`.
179
180
"""
180
181
def destroy (self , request , * args , ** kwargs ):
181
182
obj = self .get_object ()
0 commit comments