Джанго: Сигнал для «пост-начальной миграции» - PullRequest
0 голосов
/ 03 мая 2018

Для настройки новых систем разработки я хотел бы получить сигнал «после начальной миграции».

Кажется, что-то подобное еще не существует.

Подробно: я хочу сигнал, который запускается после первоначальной миграции. Второй вызов «manage.py migrate» не должен издавать этот сигнал.

Вариант использования: я хочу настроить базовые данные (добавить несколько пользователей и групп, добавить несколько фиктивных данных для "example.com", ...).

Я не хочу использовать миграцию для этого, так как в миграции у меня есть только ограниченная модель, которая возвращается apps.get_model("myapp", "Country").

То же самое для приборов: я не хочу использовать приборы, потому что мои задачи выполняются гораздо менее болезненно, если у меня есть настоящая модель ORM.

Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

@ Предложение Alasdair с сигналом post-migrate звучит хорошо, но я все равно добавлю свои два цента.

В прошлых ситуациях, когда мне требовались начальные данные (например, суперпользователь и некоторые базовые данные конфигурации), я использовал пользовательскую команду администратора , чтобы убедиться, что некоторые исходные данные присутствовали. Светильники точно не достигли того, что мне было нужно в таких ситуациях.

Эта команда администратора должна быть идемпотентной в том смысле, что она вносит изменения только в том случае, если желаемое состояние еще не достигнуто.

Например, моя команда 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')
0 голосов
/ 03 мая 2018

Вы можете использовать сигнал post_migrate. Проверьте, не созданы ли ваши фиктивные данные (например, if User.objects.exists():), и остановите, если это так.

...