在 Django 中做一次
Do something once in django
我想在每个项目的生命周期内创建两个组。所以,我读到了 AppConfig
我创建了 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.py
中:default_app_config = 'core.appconfig.RolesConfig'
但是当我 运行 服务器并转到管理页面时,没有组。为什么? AppConfig
什么时候调用?
这里有几处错误:
确保appconfig.py
的路径是myapp/appconfig.py
。
确保 name
是您的 Django 应用程序名称(例如 myapp
)。
将 create_roles(self)
重命名为 ready(self)
。
在myapp/__init__.py
中(如果不存在就创建这个文件)添加这一行:
default_app_config = 'myapp.appconfig.RolesConfig'
删除driver.save()
和manager.save()
,它们是多余的,因为create()
已经将对象保存在数据库中。
(将 myapp
替换为您的 Django 应用程序名称。)
我认为@Leistungsabfall 的回答是正确的,除此之外:不要这样做。应用程序配置不是为此目的而构建的,您应该创建固定装置:https://docs.djangoproject.com/en/1.8/howto/initial-data/ .
应用程序配置是 运行 每次你 运行 应用程序所以它不会真正工作。
考虑使用 data migration:
- 使用
manage.py makemigrations <app_name> --empty
创建一个空的迁移文件。
- 创建一个将默认值添加到数据库的函数。
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 有利于数据迁移。
我想在每个项目的生命周期内创建两个组。所以,我读到了 AppConfig
我创建了 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.py
中:default_app_config = 'core.appconfig.RolesConfig'
但是当我 运行 服务器并转到管理页面时,没有组。为什么? AppConfig
什么时候调用?
这里有几处错误:
确保
appconfig.py
的路径是myapp/appconfig.py
。确保
name
是您的 Django 应用程序名称(例如myapp
)。将
create_roles(self)
重命名为ready(self)
。在
myapp/__init__.py
中(如果不存在就创建这个文件)添加这一行:default_app_config = 'myapp.appconfig.RolesConfig'
删除
driver.save()
和manager.save()
,它们是多余的,因为create()
已经将对象保存在数据库中。
(将 myapp
替换为您的 Django 应用程序名称。)
我认为@Leistungsabfall 的回答是正确的,除此之外:不要这样做。应用程序配置不是为此目的而构建的,您应该创建固定装置:https://docs.djangoproject.com/en/1.8/howto/initial-data/ .
应用程序配置是 运行 每次你 运行 应用程序所以它不会真正工作。
考虑使用 data migration:
- 使用
manage.py makemigrations <app_name> --empty
创建一个空的迁移文件。 - 创建一个将默认值添加到数据库的函数。
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 有利于数据迁移。