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 :-)
This commit is contained in:
Λlisue 2012-03-16 12:32:40 +09:00
parent 55317b0372
commit a336681012
2 changed files with 26 additions and 6 deletions

View File

@ -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, {})

View File

@ -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)