Django - 管理工具中缺少某些权限
我对这个情况有点困惑。我在Eclipse里使用Django,创建了一个新的Django项目,然后把之前项目的代码复制到了这个新项目里。我运行了syncdb来设置数据库。接着我去管理页面想重新创建我的用户组,但我发现可用权限的列表里缺少了一些权限。在之前的项目中,有一个权限可以让我“访问”某个用户的资料。而在这个新项目里,这个权限不在列表里,但我正好需要这个权限。它去哪儿了呢?
2 个回答
这个问题是在我搜索为什么在创建新的数据库实例时,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!
对于这个问题,我在想原项目中的某个数据迁移步骤是否包含了这一步,但后来的步骤没有,所以有一些权限,但不是全部。
它去哪儿了?
当你逐步修改数据库,比如删除表格和运行同步数据库的命令时,应用表中的主键(PK)在 auth_permission
表中可能会发生变化。
如果可以的话,尽量不要做“逐步”的修改。
先把你的数据提取出来。
然后删除你的数据库。
接着重新运行同步数据库的命令来重建数据库。
最后再把你的数据加载回去。
这样你会更开心。