在 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 什么时候调用?

这里有几处错误:

  1. 确保appconfig.py的路径是myapp/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()已经将对象保存在数据库中。

(将 myapp 替换为您的 Django 应用程序名称。)

我认为@Leistungsabfall 的回答是正确的,除此之外:不要这样做。应用程序配置不是为此目的而构建的,您应该创建固定装置:https://docs.djangoproject.com/en/1.8/howto/initial-data/ .

应用程序配置是 运行 每次你 运行 应用程序所以它不会真正工作。

考虑使用 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')
  1. 向您的迁移添加 RunPython 操作:
class Migration(migrations.Migration):
    operations = [
        migrations.RunPython(create_roles),
    ]

数据固定装置的自动加载 deprecated 有利于数据迁移。