【问题标题】:Django: Signal for "post initial migration"Django:“初始迁移后”的信号
【发布时间】:2018-05-03 09:23:35
【问题描述】:

为了设置新的开发系统,我想要一个“初始迁移后”信号。

好像还没有这样的东西。

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

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

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

对于固定装置也是如此:我不想使用固定装置,因为如果我拥有真正的 ORM 模型,我完成任务的痛苦就会大大减少。

有办法解决吗?

【问题讨论】:

  • 你能详细解释一下这个用例吗?
  • 你的意思是第一次迁移时有一些信号?
  • @AnshulSharma 我更新了我的问题。它现在包含一个用例。
  • @seuling 我更新了我的问题。如果还有什么不清楚的地方请告诉我。

标签: django django-signals


【解决方案1】:

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

【讨论】:

  • 是的,这是一个务实的解决方案。谢谢
  • 我现在在“post_migrate”信号处理程序中使用 get_or_create()。
【解决方案2】:

@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')

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2017-09-05
    • 1970-01-01
    • 2015-09-06
    • 2011-11-19
    • 1970-01-01
    • 2014-10-25
    • 2021-07-17
    • 2014-11-19
    相关资源
    最近更新 更多