2015-06-20 83 views
2

由於initial_data fixture的使用已過時,因此我試圖通過遷移來添加初始數據。Django:提供遷移初始組

我創建了我的模型,其中一個模型包含代碼爲can_use_feature的權限。

當我運行makemigrations時,會創建一個0001_initial.py遷移。所述migrate命令創建數據庫,以及填充並從上述許可是在auth_permission表。

現在我想有默認的數據庫權限的組,所以我創建這個遷移爲0002_default_group.py

from __future__ import unicode_literals 
from django.db import migrations 


def create_default_group(apps, schema_editor): 

    GroupModel = apps.get_model('auth', 'group') 

    group = GroupModel(name='My Group') 
    group.save() 

    PermissionModel = apps.get_model('auth', 'permission') 
    permission = PermissionModel.objects.get(codename='can_use_feature') 
    group.permissions.add(permission) 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('myapp', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(create_default_group), 
    ] 

現在神祕的東西發生了:當我再次刪除數據庫,並執行migrate命令,DoesNotExist引發錯誤,就在permission = PermissionModel.objects.get(codename='can_use_feature')線。

當我刪除了0002_default_group.py,刪除數據庫,執行migrate,複製0002_default_group.py返回並再次運行migrate,一切工作正常,在我想要的方式創建組。

什麼是必須爲了得到遷移到只有一步工作,是否會改變?

回答

2

權限是在post_migrate信號觸發時創建的。如果在當前運行的所有遷移完成這個信號僅觸發。您不能依賴您的遷移中存在的權限。

創建權限的信號接收器會檢查現有權限,因此您可以自行創建權限(如果它尚不存在)。

也可以在('auth', '__latest__')上添加依賴關係,以確保Permission模型的遷移已經運行並且至少存在該表。

+0

因此,對於工作數據庫,我們在幾個步驟中進行遷移:首先,我們遷移'auth','site'和其他使用'post-migrate'的應用程序,然後遷移其他應用程序。但是測試數據庫是什麼?它是不可能來調整遷移過程 – kammala

+0

我想這是不完全清楚,但我的觀點是,你shoulf在'create_default_group自行創建()',如果他們沒有在這一點上存在。然後,您可以一次運行所有遷移。 – knbk