Django - 管理工具中缺少某些权限

3 投票
2 回答
2354 浏览
提问于 2025-04-16 09:24

我对这个情况有点困惑。我在Eclipse里使用Django,创建了一个新的Django项目,然后把之前项目的代码复制到了这个新项目里。我运行了syncdb来设置数据库。接着我去管理页面想重新创建我的用户组,但我发现可用权限的列表里缺少了一些权限。在之前的项目中,有一个权限可以让我“访问”某个用户的资料。而在这个新项目里,这个权限不在列表里,但我正好需要这个权限。它去哪儿了呢?

2 个回答

0

这个问题是在我搜索为什么在创建新的数据库实例时,django在数据迁移过程中给我提示“找不到权限”错误时出现的。

对我来说,答案和权限在“迁移后信号”步骤中是如何创建的有关。当逐步构建迁移时,这个信号会被触发,从而创建权限。但在重建数据库时,直到最后一次迁移成功完成,这个信号才会被触发。所以如果你的某个数据迁移步骤引用了权限,就会出现我遇到的错误。具体来说,我们在开发过程中数据模型发生了很大变化,所以我们清除了迁移,复制了数据迁移,然后执行了 migrate

这里有个很棒的讨论:https://www.webinative.com/blog/django-permission-not-found-error/

解决办法是强制在需要权限的任何数据迁移之前创建这些权限。

from django.db import migrations
from django.contrib.auth.management import create_permissions

def force_create_permissions(apps, schema_editor):
    """ creates permissions without waiting for post_migrate signal """
    for app_config in apps.get_app_configs():
        app_config.models_module = True
        create_permissions(app_config, apps=apps, verbosity=0)
        app_config.models_module = None

[ the rest of your data migration logic...]

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

    operations = [
        migrations.RunPython(force_create_permissions),
        migrations.RunPython(...)
    ]

非常感谢链接的博客文章,所有的功劳都归于作者Magesh Ravi!

对于这个问题,我在想原项目中的某个数据迁移步骤是否包含了这一步,但后来的步骤没有,所以有一些权限,但不是全部。

3

它去哪儿了?

当你逐步修改数据库,比如删除表格和运行同步数据库的命令时,应用表中的主键(PK)在 auth_permission 表中可能会发生变化。

如果可以的话,尽量不要做“逐步”的修改。

  1. 先把你的数据提取出来。

  2. 然后删除你的数据库。

  3. 接着重新运行同步数据库的命令来重建数据库。

  4. 最后再把你的数据加载回去。

这样你会更开心。

撰写回答