2015-05-26 50 views
0

我想在每個項目的生命中創建兩個組。所以,我讀到AppConfig在django做一件事

我創建core.appconfig.py

from django.apps import AppConfig 
from django.contrib.auth.models import Group 

class RolesConfig(AppConfig): 
    name = 'roles_config' 
    verbose_name = 'Roles configuration' 
    def create_roles(self): 
     driver = Group.objects.create(name='driver') 
     manager = Group.objects.create(name='manager') 
     driver.save() 
     manager.save() 

而且在settings.pydefault_app_config = 'core.appconfig.RolesConfig' 但是當我運行服務器,並進入管理頁面,沒有任何團體。爲什麼? AppConfig何時被調用?

回答

4

考慮使用data migration

  1. 創建manage.py makemigrations <app_name> --empty一個空遷移文件。
  2. 創建一個將默認值添加到數據庫的函數。
def create_roles(apps, schema_editor): 
    Group = apps.get_model('auth', 'Group') 
    driver = Group.objects.create(name='driver') 
    manager = Group.objects.create(name='manager')
  • 添加RunPython操作你遷移:
  • class Migration(migrations.Migration): 
        operations = [ 
         migrations.RunPython(create_roles), 
        ]

    數據燈具的自動裝載已deprecated支持數據遷移。

    +0

    將'RunPython'添加到'__init __。py'還是'0001_initial.py'?而如果我已經在該應用程序的遷移目錄? – Andrew

    +0

    在步驟1中由'makemigrations'創建的文件。如果您之前進行了遷移,則無關緊要,它將創建一個依賴於較早遷移的新遷移。你的'__init __。py'應該是空的。請務必閱讀[文檔](https://docs.djangoproject.com/en/1.8/topics/migrations/#data-migrations),因爲我可能錯過了一些東西。 – knbk

    +0

    對此有疑問:'Group = apps.get_model('myapp','Group')'。 Group是一個Python模型,所以我應該寫什麼應用程序? – Andrew

    1

    有幾件事情錯在這裏:

    1. 確保路徑appconfig.pymyapp/appconfig.py

    2. 確保name是您的Django應用程序名稱(例如myapp)。

    3. 重命名create_roles(self)ready(self)

    4. myapp/__init__.py(如果它不存在,創建這個文件)加入這一行:

      default_app_config = 'myapp.appconfig.RolesConfig' 
      
    5. 刪除driver.save()manager.save(),他們是多餘的,因爲create()已經做保存在數據庫中的對象。

    (與你的Django應用程序名稱替換myapp。)

    +0

    在這個'default_app_config ='myapp.apps.RolesConfig''也許''myapp.appconfig.RolesConfig''? – Andrew

    +0

    你說得對。 ''myapp.apps.RolesConfig''必須是''myapp.appconfig.RolesConfig''。我編輯了答案。 – Leistungsabfall

    3

    我認爲@Leistungsabfall的答案是正確的,除了是:不這樣做。應用程序配置不是爲此目的而構建的,而應該創建固件:https://docs.djangoproject.com/en/1.8/howto/initial-data/

    每次運行應用程序時都會運行應用程序配置,因此它不會起作用。

    +0

    我完全同意你的看法。 – Leistungsabfall

    +0

    部署我的網站時,我猜'fixtures'不能在服務器上工作。還是我錯了?我曾經使用燈具,我只是加載一些初始數據,並且總是必須運行'loaddata'。但是如何在不寫'loaddata'的情況下做到這一點,它會自動創建兩個組? – Andrew

    +0

    你錯了,夾具絕對會在你的服務器上工作,除了你應該只運行一次 - 當你創建數據庫時。只要您還指定主鍵值,固定裝置也不會創建複製品。 –

    相關問題