How do I return 404 when tastypie interacts with sources other than ORM?

I use the facade scheme described here: http://django-tastypie.readthedocs.org/en/latest/non_orm_data_sources.html

def obj_get(self, request=None, **kwargs): rv = MyObject(init=kwargs['pk']) audit_trail.message( ... ) return rv 

I can not return None, it gives an error.

+7
source share
2 answers

You must throw an exception: tastypie.exceptions.NotFound (as per the code documentation).

I am working on tastypie for CouchDB and delving into the problem. In the tastypie.resources.Resource class, you can find a method that you must override:

 def obj_get(self, request=None, **kwargs): """ Fetches an individual object on the resource. This needs to be implemented at the user level. If the object can not be found, this should raise a ``NotFound`` exception. ``ModelResource`` includes a full working version specific to Django's ``Models``. """ raise NotImplementedError() 

My example:

 def obj_get(self, request=None, **kwargs): """ Fetches an individual object on the resource. This needs to be implemented at the user level. If the object can not be found, this should raise a ``NotFound`` exception. """ id_ = kwargs['pk'] ups = UpsDAO().get_ups(ups_id = id_) if ups is None: raise NotFound( "Couldn't find an instance of '%s' which matched id='%s'."% ("UpsResource", id_)) return ups 

One thing is strange to me. When I looked at the obj_get method in the ModelResource class (superclass of the Resource class):

 def obj_get(self, request=None, **kwargs): """ A ORM-specific implementation of ``obj_get``. Takes optional ``kwargs``, which are used to narrow the query to find the instance. """ try: base_object_list = self.get_object_list(request).filter(**kwargs) object_list = self.apply_authorization_limits(request, base_object_list) stringified_kwargs = ', '.join(["%s=%s" % (k, v) for k, v in kwargs.items()]) if len(object_list) <= 0: raise self._meta.object_class.DoesNotExist("Couldn't find an instance of '%s' which matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs)) elif len(object_list) > 1: raise MultipleObjectsReturned("More than '%s' matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs)) return object_list[0] except ValueError: raise NotFound("Invalid resource lookup data provided (mismatched type).") 

exception: self._meta.object_class.DoesNotExist occurs when the object is not found, which ultimately becomes the ObjectDoesNotExist exception, so there is no consensus in the project.

+6
source

I am using ObjectDoesNotExist exeption from django.core.exceptions

  def obj_get(self, request=None, **kwargs): try: info = Info.get(kwargs['pk']) except ResourceNotFound: raise ObjectDoesNotExist('Sorry, no results on that page.') return info 
+2
source

All Articles