Search code examples
djangomongodbtastypie

Tastypie return data from DELETE requests?


I have a simple resource that I would like perform a DELETE. On success I would like to get the ID of the object that was deleted. As per the docs, always_return_data - Specifies all HTTP methods (except DELETE) should return a serialized form of the data.

http://django-tastypie.readthedocs.org/en/latest/resources.html#always-return-data

class SimpleResource(resources.MongoEngineResource):
    class Meta:
        queryset = Simple.objects.all()
        resource_name = 'simple'
        allowed_methods = ('get', 'put', 'post', 'delete', 'patch')
        always_return_data = True

Question: Is there anyway to serialize data to return the object that was deleted?


Solution

  • Looking at the source and documentation for tastypie, it looks like you'll need to override two functions of ModelResource (which MongoEngineResource inherits):

    1. obj_delete which deletes the object.

    2. delete-detail which is called on a DELETE request and calls obj_delete then returns a 204 No Content or 404 Not Found

    I haven't worked with tastypie so this is all from looking at the documentation, but it's at least a starting point. You'll need to do something like this to your class:

    class SimpleResource(resources.MongoEngineResource):
        class Meta:
            queryset = Simple.objects.all()
            resource_name = 'simple'
            allowed_methods = ('get', 'put', 'post', 'delete', 'patch')
            always_return_data = True
    
    
        def obj_delete(self, bundle, **kwargs):
            try:
                # get an instance of the bundle.obj that will be deleted
                deleted_obj = self.obj_get(bundle=bundle, **kwargs)
            except ObjectDoesNotExist:
                raise NotFound("A model instance matching the provided arguments could not be found.")
            # call the delete, deleting the obj from the database
            super(MongoEngineResource, self).obj_delete(bundle, **kwargs)
            return deleted_obj
    
    
        def delete_detail(self, request, **kwargs):
            bundle = Bundle(request=request)
    
            try:
                # call our obj_delete, storing the deleted_obj we returned
                deleted_obj = self.obj_delete(bundle=bundle, **self.remove_api_resource_names(kwargs))
                # build a new bundle with the deleted obj and return it in a response
                deleted_bundle = self.build_bundle(obj=deleted_obj, request=request)
                deleted_bundle = self.full_dehydrate(deleted_bundle)
                deleted_bundle = self.alter_detail_data_to_serialize(request, deleted_bundle)
                return self.create_response(request, deleted_bundle, response_class=http.HttpNoContent)
            except NotFound:
                return http.HttpNotFound()