2013-04-11 72 views
4

我有一个使用Django和TastyPie构建的REST API。我的目标是在新数据发布到特定模型时将任务添加到我的作业队列中。Django TastyPie,如何使用ManyToMany字段在POST后触发操作?

我打算进入post_save,然后触发,但是模型包含ManyToMany关系,所以post_save在m2m关系更新之前被触发,并且挂接到m2m_changed信号似乎很混乱。我得到了多个信号事件,我的代码需要在每个事件之后检查实例,并尝试确定是否准备好触发事件。 ManyToMany字段中的某些字段可能为空,因此,当我收到m2m_changed信号时,我不确定是否已完成保存。

有没有正确的方法来做到这一点? TastyPie是否允许我钩入POST事件并最终做些什么?我发现的所有事情都指向了post_save事件来做到这一点。

当给定模型实例的所有m2m更新完成时,Django是否有办法指示我?

+0

我发现了一个稍微不愉快的方法,通过覆盖保存所有模型后调用的tastypie create_response()方法来实现此目的。我仍然不喜欢它。 – 2013-04-11 18:09:16

+0

我也尝试使用wrap_view,但这需要我重新解析响应的内容以获取刚创建的对象的ID。看起来效率很低。 – 2013-04-11 18:25:13

回答

7

如果使用POST,然后obj_update()似乎并没有为我工作。什么做的工作是用obj_create()如下:

class Resource(ModelResource): 
    def obj_create(self,bundle,**kwargs): 
     bundle = super(Resource,self).obj_create(bundle,**kwargs) 

     # Add code here 

     return bundle 

有一点要注意的是,request不包括在内。我试过了,它给了我一个错误。

+1

您可以从包中获取请求。 bundle.request对我来说工作正常。 – 2013-05-25 01:49:24

6

您应该能够覆盖obj_update方法

class Resource(ModelResource): 
    def obj_update(self, bundle, request, **kwargs): 
     bundle = super(Resource, self).obj_update(bundle, **kwargs) 

     # queue your task here 
     return bundle