Skip to content

Commit 34776da

Browse files
committed
Minor mixin refactoring
1 parent b6fb377 commit 34776da

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

rest_framework/mixins.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ def _get_validation_exclusions(obj, pk=None, slug_field=None, lookup_field=None)
4343
class CreateModelMixin(object):
4444
"""
4545
Create a model instance.
46-
Should be mixed in with any `GenericAPIView`.
4746
"""
4847
def create(self, request, *args, **kwargs):
4948
serializer = self.get_serializer(data=request.DATA, files=request.FILES)
@@ -68,7 +67,6 @@ def get_success_headers(self, data):
6867
class ListModelMixin(object):
6968
"""
7069
List a queryset.
71-
Should be mixed in with `MultipleObjectAPIView`.
7270
"""
7371
empty_error = "Empty list and '%(class_name)s.allow_empty' is False."
7472

@@ -101,7 +99,6 @@ def list(self, request, *args, **kwargs):
10199
class RetrieveModelMixin(object):
102100
"""
103101
Retrieve a model instance.
104-
Should be mixed in with `SingleObjectAPIView`.
105102
"""
106103
def retrieve(self, request, *args, **kwargs):
107104
self.object = self.get_object()
@@ -112,17 +109,22 @@ def retrieve(self, request, *args, **kwargs):
112109
class UpdateModelMixin(object):
113110
"""
114111
Update a model instance.
115-
Should be mixed in with `SingleObjectAPIView`.
116112
"""
117-
def update(self, request, *args, **kwargs):
118-
partial = kwargs.pop('partial', False)
119-
self.object = None
113+
def get_object_or_none(self):
120114
try:
121-
self.object = self.get_object()
115+
return self.get_object()
122116
except Http404:
123117
# If this is a PUT-as-create operation, we need to ensure that
124118
# 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:
126128
created = True
127129
save_kwargs = {'force_insert': True}
128130
success_status_code = status.HTTP_201_CREATED
@@ -175,7 +177,6 @@ def pre_save(self, obj):
175177
class DestroyModelMixin(object):
176178
"""
177179
Destroy a model instance.
178-
Should be mixed in with `SingleObjectAPIView`.
179180
"""
180181
def destroy(self, request, *args, **kwargs):
181182
obj = self.get_object()

0 commit comments

Comments
 (0)