django - 如何在 Django 中对 post_migrate 信号执行代码?

标签 django django-signals django-migrations

我正在为我的项目进行某种重构,在那里我依赖于 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文章,他们说我应该在名为 management.py 的文件中定义我的 post_migrate 处理程序。 ,但它对我不起作用。

最后,这是我的问题:我应该把这个代码放在我的自定义 post_migrate 信号的哪里?

最佳答案

Django docs推荐连接post_migrate在您的应用程序配置的就绪方法中发出信号。在文档更新之前,您链接到的 Google 群组帖子已过时。

您还需要specify the app config在您的 INSTALLED_APPS环境。

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

另一种配置应用程序的方法是使用 default_app_config__init__.py你的应用程序。见 Configuring Applications .但另一种方式(AppConfig 的虚线路径)是首选。

关于django - 如何在 Django 中对 post_migrate 信号执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32446788/

相关文章:

Django PostgreSQL 异步提交

django - 什么是签名 cookie 以及它们为何有用?

django - 当通过管理站点修改 Django CharField 时发送电子邮件通知

python - 对特定请求使用 request_started 信号

python - 在迁移文件中使用特定模型时,Django 测试失败

django - PyCharm3,如何摆脱 "cannot resolve directory"消息?

python - Django pre_save 信号 - 异常会导致交易失败吗?

python - 在 django 迁移期间处理数据?

python - "No installed app with label ' 管理员 '"运行 Django 迁移。该应用程序已正确安装

python - 使用django在网页上传递错误信息