django.contrib.auth.models.Permission.DoesNotExist:权限匹配查询不存在

hgb9j2n6  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(293)

在为用户分配权限时,我收到错误django.contrib.auth.models.Permission.DoesNotExist: Permission matching query does not exist
当我查看数据库时,我发现模型没有显示为内容类型; django也没有为它们创建默认的添加/更改/删除/查看权限。
如何解决此问题?
我尝试过的事情:
1.在新数据库上运行python manage.py migrate....问题依然存在。
1.取消应用所有迁移,然后重新应用它们...问题依然存在。
1.在我的任何应用程序迁移之前应用auth,contenttypes,sessions,admin迁移。问题依然存在。
我使用的部分代码片段如下:

app = "MyApp"
                model = "MyModel"
                users = "user1"
                userGroup = "group1"
                permissionsString = "advc"
                modelClass = apps.get_model(app, model)
                contentType = ContentType.objects.get_for_model(modelClass)

                if (contentType == None):
                    raise Exception("ContentType isn't available.")

                permissions = Permission.objects.filter(content_type = contentType)
                for permissionLiteral in permissionsString:
                    if (permissionLiteral == 'a'):
                        permission = permissions.get(codename__startswith = 'add_')
                    elif (permissionLiteral == 'c'):
                        permission = permissions.get(codename__startswith = 'change_')
                    elif (permissionLiteral == 'd'):
                        permission = permissions.get(codename__startswith = 'delete_')
                    elif (permissionLiteral == 'v'):
                        permission = permissions.get(codename__startswith = 'view_')
                    else:
                        raise Exception("Invalid permission literal.")
                    if (permission != None):
                        group.permissions.add(permission)
  • app =我的应用程序的名称被传递给函数
  • model =传递给函数的模型名称
  • permissionsString =为所有4个权限传递'advc';'v'仅用于查看权限。

执行任何permission = permissions.get(...)语句时都会引发错误django.contrib.auth.models.Permission.DoesNotExist: Permission matching query does not exist

d4so4syb

d4so4syb1#

我找到了答案,感谢#django IRC频道。
因此,问题是content_types和权限是由post_migration信号创建的;而不是在迁移过程中。这就是为什么它们在迁移时不可用的原因。(更多信息,请阅读this django discussion
因此,作为django开发者,我们需要遵循以下标准实践:
1.迁移需要专门保留用于对数据库的原理图更改;不要在迁移过程中执行数据迁移和权限分配。
1.对于数据迁移和权限分配,创建django-admin命令。django-admin命令在django文档herehere中解释。
再次感谢django IRC频道的hop和dodo。特别感谢hop连夜排除故障并解决了这个问题。

相关问题