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

时间:2017-07-27 17:48:02

标签: django django-migrations django-1.8

我有以下情况:

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 个答案:

答案 0 :(得分:0)

这就是为什么你得到数据迁移的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已经可以自行迭代。