Определение пользовательского сигнала post_migrate

Я делаю какой-то рефакторинг для своего проекта, где полагаюсь на модель django django.contrib.auth.models.Permission. До сих пор я определяю разрешения для каждого нового пользователя, используя сигнал post_save, поэтому, когда пользователь создается, я назначаю его разрешения, используя user.user_permissions.add(the_permission), это работает отлично.

Теперь я хочу использовать модель django.contrib.auth.models.Group для классификации прав, которые должен иметь пользователь.

Это мой код:

from django.apps import AppConfig
from django.db.models.signals import post_migrate
from django.contrib.auth.models import Group, Permission


def create_group(name, permissions):
    group = Group.objects.create(name=name)
    [group.permissions.add(permission) for permission in permissions]


def define_company_groups(sender, **kwargs):
    permissions = [
        Permission.objects.get(codename='add_mymodel'),
        Permission.objects.get(codename='change_mymodel'),
    ]
    create_group('managers', permissions)


class MyAppConfig(AppConfig):
    name = 'players'
    verbose_name = 'The players app'

    def ready(self):
        post_migrate.connect(define_company_groups, sender=self)

После определения этого кода я ожидаю, что после вызова ./manage.py migrate этот обработчик должен быть запущен. Но этого не происходит, все, что я получил, это:

Running post-migrate handlers for application players
Adding permission 'players | mymodel | Can add mymodel'
Adding permission 'companies | company | Can change mymodel'
Adding permission 'companies | company | Can delete company'

Я нашел эту https://groups.google.com/forum/#!topic/django-developers/8MdaWtJp4VQ статью, они говорят, что я должен определить свой обработчик post_migrate в файле с именем management.py, но он не работает для меня.

Наконец, вот мой вопрос: Где я должен поместить этот код для моего пользовательского сигнала post_migrate?

Ответ 1

Django docs рекомендует подключать сигнал post_migrate в методе конфигурации вашего приложения. Запись групп Google, на которую вы ссылаетесь, устарела, до обновления документов.

Вам также необходимо указать конфигурацию приложения в настройках INSTALLED_APPS.

INSTALLED_APPS = [
    'myapp.apps.MyAppConfig',
    # ...
]

Другой способ настройки вашего приложения - использовать default_app_config в __init__.py вашего приложения. См. Настройка приложений. Но другой путь (пунктирный путь к AppConfig) предпочтительнее.

Ответ 2

Сигнал post_migrate отличается от других сигналов. Команда "./manage.py" не выполнит код из файлов apps.py или файлов signal.py Чтобы выполнить этот сигнал, поместите его в файл models.py. Тогда вы получите желаемый результат