Django 从 2.0 迁移到 2.2(查看权限问题)

Posted

技术标签:

【中文标题】Django 从 2.0 迁移到 2.2(查看权限问题)【英文标题】:Django Migration from 2.0 to 2.2(View Permissions Issue) 【发布时间】:2019-10-16 01:04:18 【问题描述】:

在迁移 Django 时面临与迁移相关的问题:

python manage.py migrate demo --database demo

获取与以下相关的错误:

ValueError: Cannot assign "ContentType: ContentType object (1)": 当前数据库路由器阻止了这种关系。

Detailed Error Log : https://ideone.com/z6NPkq

Tested Django Version:在Django版本2.0.13之后,面临这个问题。

让我知道这可能是什么原因?

编辑:在 Django 2.1 中找到原因,他们添加了视图权限:Source

为什么视图权限没有自动生成?

解决方案:在Django模块中,如果我们将移动到文件路径:django/contrib/auth/management/__init.py

我们必须更改行号:79

Permission(codename=codename, name=name, content_type=ct)

Permission(codename=codename, name=name, content_type_id=ct.id)

我在 Django 中调试后找到了这个解决方案,但仍然无法理解为什么会发生这种情况。让我知道其他解决方案以及此解决方案的任何原因。

EDIT-1:寻找答案,这样我就不必更改核心 Django 模块(库)。

解决方案-1

def allow_relation(self, obj1, obj2, **hints):
    if obj1._state.db == "demo" or obj2._state.db=="demo":
        return True
    return obj1._state.db == obj2._state.db 

注意:在我的情况下,其他数据库使用演示数据库表作为参考,因此在 Approuter 类中自定义了 allow_relation 方法。

【问题讨论】:

【参考方案1】:

似乎是路由器问题。这应该是因为您正在使用具有多个数据库配置的 Django。 根据上面的示例,您需要覆盖应用路由器中的allow_relation函数,以允许存在content-type的数据库与演示数据库之间的关系。

【讨论】:

我们能看到 allow_relation 覆盖吗?还是只是您的建议。谢谢 @OhadtheLad 我在问题部分添加了解决方案

以上是关于Django 从 2.0 迁移到 2.2(查看权限问题)的主要内容,如果未能解决你的问题,请参考以下文章

Django 从 MySQL 迁移到 Postgres

Django:在还原(迁移)后尝试访问数据库时权限被拒绝

基于 Docker 的 Gitlab 环境迁移遇坑记录

基于 Docker 的 Gitlab 环境迁移遇坑记录

基于 Docker 的 Gitlab 环境迁移遇坑记录

在 vagrant 的 Django 应用程序中创建迁移文件夹的权限被拒绝