2009-02-27 55 views
6

您需要重新命名Django中的模型(或者,在最近遇到的一種情況下,將一個模型拆分爲兩個,使用新名稱或不同名稱) 。是的,適當的計劃有助於避免這種情況,但有時會有現實介入。在Django中重命名模型之後修復auth_permission表

重命名數據庫中的相應表並修復受影響的代碼後,仍然存在一個問題:授予用戶或組對這些模型進行操作的任何權限仍會引用舊的模型名稱。有沒有自動或半自動的方法來解決這個問題,還是僅僅是手動db手術的問題? (在開發中,您可以放棄auth_permissions表和syncdb來重新創建它,但生產並不那麼簡單)。

回答

0

我通過一個詳細的攻擊計劃,在這種情況下獲得了大約一半的時間,但是在寫這篇文章的時候我意識到可能沒有任何辦法可以在這個時候進行維護停機情況。

儘管需要注意確保auth_perms主鍵同步,但您可以通過準備一個準備好的loaddata腳本來儘可能減少停機時間。

另請參閱簡短的回答:沒有自動化的方式來做到這一點,我知道。

2

這裏是a snippet,它填補了丟失的內容類型和權限。我想知道是否可以擴展到至少做一些驢工作來清理auth_permissions。

+0

注意這個版本的腳本不使用Django 1.0的工作 - 使用http://www.djangosnippets.org/snippets/696 /代替。 – shacker 2009-09-03 13:30:30

2

如果你碰巧使用了南方模式移植到重命名錶,向前遷移以下行會這個自動完成:

db.send_create_signal('appname', ['modelname']) 
+0

這很奇妙! – gaqzi 2012-12-14 08:24:49

1

最近,我有這個問題,並寫信給解決功能它。如果您重命名模型/表格,則通常會與ContentType和Permission表格有差異。 Django的有內置的輔助函數來解決問題,你可以使用它們如下:

from django.contrib.auth.management import create_permissions 
from django.contrib.contenttypes.management import update_all_contenttypes 
from django.db.models import get_apps 

def update_all_content_types_and_permissions(): 
    for app in get_apps(): 
     create_permissions(app, None, 2) 
    update_all_contenttypes() 
+0

在我的情況下不起作用(Django 1.7):`'module'對象沒有屬性'models_module'` – linqu 2015-03-30 16:15:33