Python Django:使用一个数据库填充另一个数据库的模型设置

Python Django:使用一个数据库填充另一个数据库的模型设置,python,django,dbmigrate,Python,Django,Dbmigrate,我正在Django(一个家谱)重建一个个人项目,我正在将实际数据从旧数据库迁移到我的新模型/模式,这两个数据库都是Postgres数据库。我在settings.py的DATABASES列表中将它们定义为“default”和“source” 我已经创建了模型,我想将旧数据库中的记录复制到新数据库中相应的表中,但我不太了解如何设置模型使其工作,因为Django代码使用模型/ORM访问/更新/创建对象,我只有反映新模式的模型,而不是旧模式的模型 巧合的是,我在新旧数据库中有一个模式完全相同的表,我有一

我正在Django(一个家谱)重建一个个人项目,我正在将实际数据从旧数据库迁移到我的新模型/模式,这两个数据库都是Postgres数据库。我在settings.py的DATABASES列表中将它们定义为“default”和“source”

我已经创建了模型,我想将旧数据库中的记录复制到新数据库中相应的表中,但我不太了解如何设置模型使其工作,因为Django代码使用模型/ORM访问/更新/创建对象,我只有反映新模式的模型,而不是旧模式的模型

巧合的是,我在新旧数据库中有一个模式完全相同的表,我有一个管理命令,可以使用我的新ImagePerson模型(
ported_data=ImagePerson.objects.using('source').all()
)从源抓取旧记录,因为预期的字段是相同的。然后我将它们的对象保存在“default”中:
(obj,created\u bool)=ImagePerson.objects。使用(“default”).get\u或\u create(field=fieldvalue等)
,它的工作原理与我需要的一样

但是当我的表中旧版本缺少新模型/表中的字段时,我无法使用该模型访问这些记录(这很有意义)。我是否应该为每个模型制作某种遗留版本,以便在迁移中使用?我看到一个教程提到运行
/manage.py inspectdb--database=source>models.py
,但这样做似乎并没有给我的文件添加任何其他内容(而且在其中保存临时/旧模型似乎很奇怪)。访问旧格式记录的正确方法是什么?ORM是对的吗

举一个具体的例子,我有一个Notes表来保存关于某个人或某个家庭的记忆。旧表使用了一个“类型”字段(1用于个人注释,2用于家庭注释),以及一个ref_id,该id将是注释所应用的个人或家庭的id。新表中有一个person\u id字段和一个family\u id字段

我希望我的管理命令能够从源表中提取所有记录,然后如果type=1,查找id等于ref_id字段的person,并与该person一起在新数据库中保存一个新对象。我可以使用新的Notes模型和旧数据库获取它们,如下所示:
ported\u Notes=Note.objects.using('source').all()
,但是如果我尝试访问任何字段(如
print(Note\u row.body)
),我会得到一个错误,结果对象缺少person\u id字段

django.db.utils.ProgrammingError: column notes.person_id does not exist

正确的方法是什么?

为旧模式创建模型显然不是正确的方法

一种解决方案是编写数据迁移,您可以使用原始SQL获取旧数据,然后使用ORW将其写入新表/模型:

from django.db import migrations, connections

def transfer_data(apps, schema_editor):
    ModelForNewDB = apps.get_model('yourappname', 'ModelForNewDB')
    # Fetch your old data
    with connections['my_old_db'].cursor() as cursor:
        cursor.execute('select * from some_table')
        data = cursor.fetchall()
    
    # Write it to your new models
    for datum in data:
        # do something with the data / add any
        # additional values needed.
        ModelForNewDB.objects.create(...)


class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(transfer_data),
    ]
然后简单地运行迁移。但有一点需要注意:


如果表之间有foreignkey等,则需要注意迁移的顺序。这可以通过编辑您的
依赖项来完成。您甚至可能需要添加迁移以允许某些外键为空值,然后再添加另一个迁移以更正此问题。

是的,这正是我想要做的事情-将尝试并跟进!