From a3366810126fabd221cd18004e3946f176a9023c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=9Blisue?= Date: Fri, 16 Mar 2012 12:32:40 +0900 Subject: [PATCH 1/2] Improve mixin's django compatibility. Django SingleObjectMixin use ``get_object(queryset=None)`` for getting model instance but django-rest-framework use ``get_instance(**kwargs)`` To use class decorator or method decorator which use ``get_object`` method to get the model instance (Eg. universal ``permission_required`` decorator found in django-permission), I simply add ``get_object`` method to ``ModelMixin`` and change codes in ``ReadModelMixin``, ``UpdateModelMixin`` and ``DeleteModelMixin`` which use ``get_instance`` method previously. Ofcourse, I confirmed that tests passed :-) --- djangorestframework/mixins.py | 24 ++++++++++++++++++------ djangorestframework/tests/mixins.py | 8 ++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/djangorestframework/mixins.py b/djangorestframework/mixins.py index 6c8f8179d..2780d171a 100644 --- a/djangorestframework/mixins.py +++ b/djangorestframework/mixins.py @@ -507,8 +507,23 @@ class ModelMixin(object): """ Get a model instance for read/update/delete requests. """ + import warnings + warnings.warn( + "``get_instance(**kwargs)`` method is deprecated. " + "use ``get_object(queryset=None)`` insted.", + DeprecationWarning + ) return self.get_queryset().get(**kwargs) + def get_object(self, queryset=None): + """ + Get a model instance for read/update/delete requests. + """ + queryset = queryset or self.get_queryset() + queryset_kwargs = self.get_query_kwargs(*self.args, **self.kwargs) + return queryset.get(**queryset_kwargs) + + def get_queryset(self): """ Return the queryset for this view. @@ -529,10 +544,9 @@ class ReadModelMixin(ModelMixin): """ def get(self, request, *args, **kwargs): model = self.resource.model - query_kwargs = self.get_query_kwargs(request, *args, **kwargs) try: - self.model_instance = self.get_instance(**query_kwargs) + self.model_instance = self.get_object() except model.DoesNotExist: raise ErrorResponse(status.HTTP_404_NOT_FOUND) @@ -585,12 +599,11 @@ class UpdateModelMixin(ModelMixin): """ def put(self, request, *args, **kwargs): model = self.resource.model - query_kwargs = self.get_query_kwargs(request, *args, **kwargs) # TODO: update on the url of a non-existing resource url doesn't work # correctly at the moment - will end up with a new url try: - self.model_instance = self.get_instance(**query_kwargs) + self.model_instance = self.get_object() for (key, val) in self.CONTENT.items(): setattr(self.model_instance, key, val) @@ -606,10 +619,9 @@ class DeleteModelMixin(ModelMixin): """ def delete(self, request, *args, **kwargs): model = self.resource.model - query_kwargs = self.get_query_kwargs(request, *args, **kwargs) try: - instance = self.get_instance(**query_kwargs) + instance = self.get_object() except model.DoesNotExist: raise ErrorResponse(status.HTTP_404_NOT_FOUND, None, {}) diff --git a/djangorestframework/tests/mixins.py b/djangorestframework/tests/mixins.py index 8268fdca7..8340580bb 100644 --- a/djangorestframework/tests/mixins.py +++ b/djangorestframework/tests/mixins.py @@ -29,6 +29,10 @@ class TestModelRead(TestModelsTestCase): request = self.req.get('/groups') mixin = ReadModelMixin() mixin.resource = GroupResource + # simulate View.dispatch + mixin.request = request + mixin.args = [] + mixin.kwargs = {'id': group.id} response = mixin.get(request, id=group.id) self.assertEquals(group.name, response.name) @@ -40,6 +44,10 @@ class TestModelRead(TestModelsTestCase): request = self.req.get('/groups') mixin = ReadModelMixin() mixin.resource = GroupResource + # simulate View.dispatch + mixin.request = request + mixin.args = [] + mixin.kwargs = {'id': 12345} self.assertRaises(ErrorResponse, mixin.get, request, id=12345) From 314c08bfa18ea26a03bf7d5591dd40621d4452e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=9Blisue?= Date: Thu, 26 Apr 2012 12:54:24 +0900 Subject: [PATCH 2/2] Fix typo on warning message. --- djangorestframework/mixins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djangorestframework/mixins.py b/djangorestframework/mixins.py index 2780d171a..ac2b9ff8d 100644 --- a/djangorestframework/mixins.py +++ b/djangorestframework/mixins.py @@ -510,7 +510,7 @@ class ModelMixin(object): import warnings warnings.warn( "``get_instance(**kwargs)`` method is deprecated. " - "use ``get_object(queryset=None)`` insted.", + "use ``get_object(queryset=None)`` instead.", DeprecationWarning ) return self.get_queryset().get(**kwargs)