2013-04-11 70 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