Django:"post initial migration" 的信号

Django: Signal for "post initial migration"

为了设置新的开发系统,我想要一个 "post initial migration" 信号。

好像还没有这样的东西

详细说明:我想要一个在初始迁移 运行 之后 运行 的信号。第二次调用 "manage.py migrate" 不应发出此信号。

用例:我想设置基本数据(添加一些用户和组,为 "example.com" 添加一些虚拟数据,...)。

我不想为此使用迁移,因为在迁移中我只有 apps.get_model("myapp", "Country") 返回的有限模型。

固定装置也一样:我不想使用固定装置,因为如果我有真正的 ORM 模型,我完成任务的痛苦就会少得多。

有没有办法解决这个问题?

您可以使用 post_migrate 信号。检查您的虚拟数据是否已创建(例如 if User.objects.exists():),如果已创建则停止。

@Alasdair 关于 post-migrate signal 的建议听起来不错,但我还是要加两分钱。

在过去需要初始数据(例如超级用户和一些基本配置数据)的情况下,我使用 custom admin command 来确保存在一些初始数据。在那些情况下,固定装置并没有完全达到我的需要。

此管理命令必须是幂等的,因为它仅在尚未达到所需状态时才进行更改。

例如,我的 ensure_auth_data 命令看起来像这样:

class Command(BaseCommand):
    help = 'Creates superuser, permissions and groups.'

    def _ensure_superuser(self):
        u_created = False
        u_updated = False
        try:
            usr = User.objects.get(username='ralf')
        except User.DoesNotExist:
            usr = User()
            usr.username = 'ralf'
            u_created = True

        if not usr.is_active:
            usr.is_active = True
            u_updated = True
        if not usr.is_superuser:
            usr.is_superuser = True
            u_updated = True

        if u_created or u_updated:
            usr.save()

        if u_created:
            self.stdout.write('Created superuser "{}"'.format(usr.username))
        elif u_updated:
            self.stdout.write('Updated superuser "{}"'.format(usr.username))
        else:
            self.stdout.write('Superuser "{}" already up to date'.format(usr.username))

    def _ensure_permissions(self):
        # create some special permissions if they're not present

    def _ensure_groups(self):
        # create some special groups and assign them permissions

    def handle(self, *args, **options):
        self.stdout.write('Starting command')
        self.stdout.write('...')
        self._ensure_superuser()
        self.stdout.write('...')
        self._ensure_permissions()
        self.stdout.write('...')
        self._ensure_groups()
        self.stdout.write('...')
        self.stdout.write('Command finished')