如何在Django Tastypie中删除之前执行验证

时间:2015-02-28 02:13:03

标签: django tastypie

我试图覆盖obj_delete来执行预删除验证,以决定是否应该根据提交的数据和数据库数据执行删除。这是我的测试代码。我不确定什么是正确的方法。

但是,我无法理解。请帮助您提供示例代码。

class HelloAuthorization(Authorization):

  def delete_detail(self, object_list, bundle):
      # Try to decide if delete should be performed HERE. But it is not get called. 
      # Why??? HELP!!!!

      return True

  def obj_delete(self, request=None, **kwargs):
    try:
      obj = self.obj_get(request, **kwargs)

      # Try to decide if delete should be performed HERE. But it is not get called. 
      # Why??? HELP!!!!

   except ObjectDoesNotExist:
      raise NotFound('A model instance matching the '
                     'provided arguments could not be found.')
    obj.delete()


class HelloResource(ModelResource):
  class Meta(object):
    queryset = models.HelloModel.objects.all()
    allowed_methods = ('get', 'post', 'put', 'delete')
    resource_name = 'hello'
    authentication = Authentication()
    authorization = HelloAuthorization()
    filtering = {'name': constants.ALL,
                 'id': constants.ALL}

  def delete_detail(self, object_list, bundle):
      # Try to decide if delete should be performed HERE. But it is not get called. 
      # Why??? HELP!!!!

      return True

  def obj_delete(self, request=None, **kwargs):
    try:
      obj = self.obj_get(request, **kwargs)

      # Try to decide if delete should be performed HERE. But it is not get called.
      # Why??? HELP!!!!

    except django_exceptions.ObjectDoesNotExist:
      raise NotFound('A model instance matching the '
                     'provided arguments could not be found.')
    obj.delete()

1 个答案:

答案 0 :(得分:0)

以下代码尚未经过测试但应该可以使用:

def obj_delete(self, bundle, **kwargs):
    _my_object = bundle.obj
    # perform validation
    if True: # validated
        super(AccountsResource, self).obj_delete(bundle, **kwargs)
    else:
        # TODO
        # do my thing here
        pass

希望这有帮助。

由于

编辑:

  

如果您要在/api/v1/hello/上发送请求,obj_delete不会被调用,要调用该请求,您需要在/api/v1/hello/1/上发送删除请求