Определение пользовательского сигнала 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.
Тогда вы получите желаемый результат