Django - 如何将属性移动到另一个模型并删除它

Posted

技术标签:

【中文标题】Django - 如何将属性移动到另一个模型并删除它【英文标题】:Django - How to move attribute to another model and delete it 【发布时间】:2018-01-03 14:13:05 【问题描述】:

我有以下场景:

class C():
    y = models.Integer...
    z = models.Integer...

class D():
    y2 = models.Integer...
    z2 = models.Integer...

我想从属性 y 复制数据并将其粘贴到 y2。好的,我创建了一个可以完成工作的数据迁移。简而言之:

from greatapp.models import C, D

class Migration(migrations.Migration):

    def move_info_to_class_d(apps, schema_editor):
        objs = C.objects.all()

        for obj in objs.iterator():
            d = D.objects.create(y2=obj.y)

    operations = [
        migrations.RunPython(move_info_to_class_d)
    ]

请注意,我还想从 C 类中删除该属性,因此代码如下所示:

class C():
    z = models.Integer...

class D():
    y2 = models.Integer...
    z2 = models.Integer...

一切看起来都不错,对吧?是时候承诺了。

哦,等等!下一个执行此代码的人将收到错误,因为数据迁移正在尝试访问不再存在的属性(在本例中为 y)。

有没有人知道一种解决方法(不需要 .sql 文件)将属性复制到另一个模型类,然后从源类中删除它?

【问题讨论】:

【参考方案1】:

这就是您在数据迁移中获得apps 参数的原因。它保存模型的定义,就像您创建数据迁移时一样。

也是这样

def move_info_to_class_d(apps, schema_editor):
    C = apps.get_model('yourappname', 'C')
    D = apps.get_model('yourappname', 'D')

    objs = C.objects.all()

    for obj in objs.iterator():
        d = D.objects.create(y2=obj.y)

它会正常工作(只要您创建在此之后删除 C.y 的迁移)。

编辑:哦,objs.iterator() 是不必要的,objs 本身已经可以迭代了。

【讨论】:

成功了,谢谢! ps.:我使用 iterator() 禁用内部缓存,因为我的电脑在没有它的情况下运行循环时内存不足(它是一个非常大的数据集) @almanegra 使用.iterator() 对大型数据集有帮助吗?你有解释的网址吗?

以上是关于Django - 如何将属性移动到另一个模型并删除它的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义用户模型迁移到 Django 中的不同应用程序?

django - 如何将实际图像文件从一个模型复制到另一个模型?

如何在 Django 中使用 South 将数据从一个模型迁移到另一个模型?

如何在 Django 中删除单个模型,并留下其他模型

moveRowAtIndexPath:如何在最后一行移动到另一个部分后删除部分

如何将 Core Data name.xcdatamodel 从一个文件夹移动到另一个文件夹?