django 权限:在所有其他迁移之后插入新权限

lio*_*ayn 6 django permissions django-models django-migrations

我向我的模型添加了新权限,然后使用了manage.py makemigrations。它创建了一个改变模型选项(特别是权限......)的迁移。

后来,我添加了一个依赖于第一个迁移的迁移,并使用了权限(我相信创建的第一个迁移)。该迁移使用了查询 auth_permissions 的 RunSQL 操作中的权限。

当我调试迁移时 - 我意识到只有在应用所有迁移之后才会插入身份验证权限。

含义 - 当我尝试查询权限的 id 以便在第二次迁移中使用它时 - 它不存在,因此第二次迁移不会按预期运行。

知道为什么会发生这种情况以及如何预防吗?我在添加新权限时的假设是,它将与 django 为我创建的迁移一起添加......而不是在不同的阶段。

谢谢!

小智 0

这是一个古老但仍然有效的话题。答案是Django只标记创建的权限。它们实际上是在 post_migrate 信号中创建的,只有在迁移成功运行后才会触发该信号。这意味着如果迁移 X 创建权限并且迁移 Y 使用该权限,则需要分两步进行迁移。在 X 之后和 Y 之前停止,然后迁移其余部分。这是官方方式,但并不总是适用(例如,自动测试会生成新数据库,但并不完全像此过程)。

您可以通过在需要它的迁移中创建虚假权限来解决此问题。这是有效的,因为权限只创建一次。但是,您必须对需要这些权限的任何迁移重复此操作,并且您需要确保它们与定义的实际权限匹配(例如,如果您需要的话,它们应该有一个名称)。示例可以在这里找到:/sf/answers/2208014441/