mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-26 16:30:41 +03:00
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:
parent
55317b0372
commit
a336681012
|
@ -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, {})
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user