2015-07-11 45 views
4

我通過在Django模型中使用'meta'來添加自定義權限。看下面的一個簡單的例子。Django元權限

Models.py

class Meta: 
    permissions = (
     ("can_do_stuff", "Can do stuff"), 
    ) 

這個偉大的工程,我上面的代碼添加到模型,然後讓我的遷移,然後將其遷移。權限被創建並可供使用。

但是,當我從我的模型的'meta'部分刪除(或修改)該權限並再次從Django系統刪除權限(已刪除/修改)makemigrations,migrate

這不會是一個問題,如果我已經想出了我的權限系統100%,但我一直在進行微調,因爲我學習的結果是權限列表與'傳統'權限混亂。

我正在開發和發佈新版本,以便頻繁使用,並且權限在生產中越來越混亂,我不能像在開發中那樣擦除數據庫。

有沒有推薦的方法呢?

我可以直接從數據庫手動刪除舊的權限(它似乎只是一個條目,我需要刪除,它似乎不會導致任何問題)。這似乎是一個糟糕的做法,容易出錯,被遺忘等。

+0

您是否嘗試過對模型進行其他修改以確保創建了新遷移,並檢查了此處未刪除權限?編輯:我發現了一個[關閉的問題](https://code.djangoproject.com/ticket/23256),看起來它已被修復。 – guival

回答

0

您是否嘗試過向後移動而不是向前移動?

<app_label> <migrationname>:將數據庫架構帶到應用了指定遷移的狀態,但是不會在同一應用程序中應用更高版本的遷移。如果您之前已遷移過指定的遷移,則可能涉及不應用遷移。使用名稱零來取消應用程序的所有遷移。

我的猜測是,makemigrations命令掃描模式的權限元,併產生權限表中的「插入」 SQL對每個缺少PERMSSION,它實際上並沒有做的遷移腳本的雙向同步。

但是,遷移腳本可以使用'delete'語句爲每個'insert'恢復更改。

所以嘗試:

python manage.py migrate the_app the_migration_before_the_last 

如果這也不行,提交bug到Django項目。