2013-07-16 63 views
1

我得到了一個模型,它在某些情況下保存時發出自定義信號。post_save從管理員調用,但m2m不保存

當我沒有從Django管理員更新我的項目時,運行這個「post_save」工作正常,但是當我使用管理員更改它們時,我看到日誌消息處理它應該做的所有事情。但它不會被保存。

我看到this question其中說這是因爲管理員使用視圖級鎖。所以我試圖運行transaction.commit()以及將@transaction.commit_manually添加到信號處理程序。可惜沒有任何東西被保存到數據庫中。

更新:這是m2m關係organisations下面,這是不正確保存。沒有任何異常或引發的任何事情,只是在通過管理員時不會被放入數據庫。

我參考處理:

@transaction.commit_manually # tried this as both first and second decorator 
@receiver(node_moved, sender=Folder) 
def folder_moved_handler(sender, instance, **kwargs): 
    transaction.commit_manually() 
    transaction.commit() 

    # When a folder was so moved it became root 
    if instance.is_root_node(): 
     # Copy these organisations to the new root 
     inherit_permissions_from = instance.inherit_permissions_from 
     print inherit_permissions_from 

     instance.inherit_permissions_from = None 
     instance.save() 
     set_inherited_permissions_descendents(instance, None) 

     if inherit_permissions_from: 
      for org in inherit_permissions_from.organisations_with_access: 
       instance.organisations.add(org) 
       print 'add org: {0}'.format(org) 

    else: 
     instance.inherit_permissions_from = get_who_to_inherit_from(instance) 
     instance.save() 

    print 'returning' 
    print transaction.commit() 

我在以什麼做虧本的那一刻,從長遠來看,我是從使用管理這個任務搬走,因爲這是一個有點笨重的一般工作流程,但直到我有時間,我只是想讓它工作。

我唯一能夠想到的就是設置一個標誌並每隔一段時間運行一個批處理作業。或者將它傳遞給目前不屬於依賴的Celery。

有什麼建議嗎?

+0

使用celery.contrib.rdb調試和找出究竟發生了什麼 – mossplix

+0

特別是rdb的任何特殊原因?我已經通過與pdb的代碼,但由於它沒有引發任何異常,我不熟悉管理員的代碼,我不知道該找什麼。有什麼建議麼? 在這種情況下,我想要運行的是添加m2m關係,它在運行時獲取輸出。但沒有反映在數據庫上。 :x – gaqzi

回答

1

您可以在ModelAdmin覆蓋save_related調用形式的save_m2m,如:

class FolderAdmin(admin.ModelAdmin): 
    form = FolderAdminForm 

    def save_related(self, request, form, formsets, change): 
     # Do my own fancy stuff 
+0

有時候,人們感覺比一疊磚塊還要笨拙。當然,我可以做到這一點,因爲我在全面考慮壓倒一切。我厭倦了厭倦。 ;) – gaqzi

0

我被鏈接到this comment其中提到,它可能是問題的形式。保存後重置我的m2m字段的表單。

所以我做了一些挖掘並試圖創建一個自定義的管理表單,可以做到這一點形成我。可悲的是,它似乎註定了;管理員不會在表單上提交。它採用表格,make it spit out an unsaved object。然後它takes that object,saves it然後最後takes the form objectsaves it。表格上的

save_m2m似乎不可覆蓋。如果我understand the documentation正確save_m2m是動態添加的,因爲我的自定義窗體並沒有停止任何我現在猜測這是真的。

所以我現在要做的是添加一個警告,做我一直在努力解決的不是管理員和一個自定義視圖的鏈接。然後在將來,完全不需要管理員完全爲應用程序的這一部分。這並不意味着我可以想象使用它的方式。

所以在MC Hammer的不朽話語中; 不能碰這個。

僅供參考我的模型形式:

class FolderAdminForm(forms.ModelForm): 
    def save_m2m(self): 
     raise Exception('For the greater good') 

class FolderAdmin(admin.ModelAdmin): 
    form = FolderAdminForm